diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..c90014a
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,302 @@
+# Contributing to Akko
+
+Thank you for your interest in contributing to Akko! This document provides guidelines for contributing to the project.
+
+## Development Setup
+
+### Prerequisites
+- Node.js 14+ (for build tools)
+- Modern browser with WebGL and Web Audio API support
+- Git
+
+### Getting Started
+```bash
+# Clone the repository
+git clone https://github.com/TimboKZ/Akko.git
+cd Akko
+
+# Install dependencies
+npm install
+
+# Build the project
+npm run build
+
+# Start development server
+npm run examples
+```
+
+## Project Structure
+
+```
+Akko/
+├── lib/ # Core framework source
+│ ├── Akko.js # Main Akko class
+│ ├── MusicPlayer.js # Audio handling
+│ ├── VisualisationCore.js # Visualizer management
+│ ├── UI.jsx # User interface
+│ └── visualisers/ # Built-in visualizers
+├── examples/ # Example implementations
+│ ├── es12-mixer/ # Modern JavaScript demo
+│ └── *.html # Basic examples
+├── dist/ # Built files (generated)
+├── sass/ # Stylesheets
+└── webpack.config.js # Build configuration
+```
+
+## Types of Contributions
+
+### 🐛 Bug Fixes
+- Audio processing issues
+- Module loading problems
+- Performance bottlenecks
+- Browser compatibility
+
+### ✨ New Features
+- New visualizer types
+- Audio analysis improvements
+- UI enhancements
+- Modern JavaScript integrations
+
+### 📚 Documentation
+- API documentation
+- Integration guides
+- Example projects
+- Performance tips
+
+### 🎨 Examples
+- New visualizer examples
+- Integration patterns
+- Educational demos
+
+## Development Guidelines
+
+### Code Style
+- **ES6+** for new code (ES5 for legacy browser support where needed)
+- **JSDoc comments** for public APIs
+- **Consistent naming**: camelCase for variables/functions, PascalCase for classes
+- **Error handling**: Always handle potential failures gracefully
+
+### Visualizer Development
+```javascript
+// Template for new visualizers
+class NewVisualiser extends Visualiser {
+ constructor() {
+ super({
+ code: 'NEW', // Unique 2-3 character code
+ name: 'New Visualiser',
+ fftSize: 256,
+ smoothingTimeConstant: 0.8
+ });
+ }
+
+ onInit(data) {
+ // Initialize 3D scene, camera, objects
+ }
+
+ onUpdate(data) {
+ // Update animation based on audio data
+ // data.frequencyData, data.timeDomainData available
+ }
+
+ onResize(data) {
+ // Handle window resize
+ }
+
+ onDestroy() {
+ // Clean up resources
+ }
+}
+```
+
+### Audio Processing Best Practices
+```javascript
+// Always validate audio data
+if (!data?.frequencyData || !data?.timeDomainData) {
+ return; // Skip frame if no audio data
+}
+
+// Check for NaN values
+const audioLevel = data.frequencyData[0] / 255;
+if (!isFinite(audioLevel)) {
+ return; // Skip if invalid data
+}
+
+// Clone buffers to prevent detachment
+const clonedBuffer = arrayBuffer.slice(0);
+```
+
+### Performance Guidelines
+- **Object pooling** for frequently created objects
+- **Efficient geometry updates** using `needsUpdate` flags
+- **LOD (Level of Detail)** for complex visualizations
+- **Resource cleanup** in `onDestroy()`
+
+## Testing
+
+### Manual Testing
+```bash
+# Start development server
+npm run examples
+
+# Test in multiple browsers:
+# - Chrome (latest)
+# - Firefox (latest)
+# - Safari (if on macOS)
+# - Edge (latest)
+```
+
+### Test Cases
+- [ ] Audio file loading and playback
+- [ ] Drag & drop functionality
+- [ ] Visualizer switching
+- [ ] Window resize handling
+- [ ] Error scenarios (invalid files, no audio permission)
+
+### Performance Testing
+- [ ] Monitor FPS with different visualizers
+- [ ] Test with various audio file formats
+- [ ] Memory usage over time
+- [ ] Mobile device performance
+
+## Submission Process
+
+### 1. Fork and Branch
+```bash
+git fork https://github.com/TimboKZ/Akko.git
+git checkout -b feature/my-new-feature
+```
+
+### 2. Development
+- Write your code following the guidelines above
+- Test thoroughly across browsers
+- Update documentation if needed
+
+### 3. Build and Lint
+```bash
+npm run build # Ensure clean build
+npm run lint # Fix any linting errors
+```
+
+### 4. Commit
+```bash
+git add .
+git commit -m "feat: add new particle visualizer with ES12+ features"
+
+# Commit message format:
+# feat: new feature
+# fix: bug fix
+# docs: documentation
+# style: formatting
+# refactor: code restructuring
+# test: adding tests
+# chore: maintenance
+```
+
+### 5. Pull Request
+- Create PR with clear description
+- Reference any related issues
+- Include screenshots/videos for visual changes
+- Ensure CI passes
+
+## Pull Request Template
+
+```markdown
+## Description
+Brief description of changes
+
+## Type of Change
+- [ ] Bug fix
+- [ ] New feature
+- [ ] Documentation update
+- [ ] Performance improvement
+- [ ] Code refactoring
+
+## Testing
+- [ ] Tested in Chrome
+- [ ] Tested in Firefox
+- [ ] Tested in Safari
+- [ ] Tested in Edge
+- [ ] Mobile testing (if applicable)
+
+## Screenshots/Videos
+(If applicable)
+
+## Checklist
+- [ ] Code follows project style guidelines
+- [ ] Self-review completed
+- [ ] Documentation updated
+- [ ] No console errors
+- [ ] Build passes (`npm run build`)
+- [ ] Lint passes (`npm run lint`)
+```
+
+## Specific Contribution Areas
+
+### Core Framework
+**Location**: `lib/`
+**Focus**: Audio processing, visualizer management, UI components
+**Requirements**: Deep understanding of Web Audio API and Three.js
+
+### Visualizers
+**Location**: `lib/visualisers/`
+**Focus**: New visualization techniques, audio-reactive effects
+**Requirements**: Three.js knowledge, creative vision
+
+### Examples
+**Location**: `examples/`
+**Focus**: Integration patterns, educational content
+**Requirements**: Clear documentation, modern JavaScript
+
+### Documentation
+**Location**: `*.md` files, JSDoc comments
+**Focus**: API docs, tutorials, integration guides
+**Requirements**: Clear writing, technical accuracy
+
+## Release Process
+
+### Version Numbering
+- **Major** (1.0.0): Breaking changes
+- **Minor** (0.1.0): New features, backwards compatible
+- **Patch** (0.0.1): Bug fixes, backwards compatible
+
+### Release Checklist
+- [ ] All tests pass
+- [ ] Documentation updated
+- [ ] CHANGELOG.md updated
+- [ ] Version bumped in package.json
+- [ ] Build artifacts updated
+- [ ] Git tag created
+
+## Community Guidelines
+
+### Code of Conduct
+- Be respectful and inclusive
+- Provide constructive feedback
+- Help newcomers learn
+- Focus on technical merit
+
+### Communication
+- **Issues**: Bug reports, feature requests
+- **Discussions**: General questions, ideas
+- **Pull Requests**: Code contributions
+
+### Getting Help
+- Check existing issues and documentation first
+- Provide minimal reproducible examples
+- Include browser/OS information
+- Be patient and respectful
+
+## Recognition
+
+Contributors are recognized in:
+- CHANGELOG.md for significant contributions
+- README.md contributors section
+- Git commit history
+
+## License
+
+By contributing to Akko, you agree that your contributions will be licensed under the GPL-3.0 license.
+
+---
+
+Thank you for contributing to Akko! Your efforts help make audio visualization more accessible and powerful for everyone. 🎵✨
\ No newline at end of file
diff --git a/INTEGRATION.md b/INTEGRATION.md
new file mode 100644
index 0000000..0f2e9f4
--- /dev/null
+++ b/INTEGRATION.md
@@ -0,0 +1,657 @@
+# Akko Integration Guide
+
+This guide shows developers how to integrate Akko with modern JavaScript features and extend the framework with custom visualizers.
+
+## Table of Contents
+- [Basic Integration](#basic-integration)
+- [Modern JavaScript Features](#modern-javascript-features)
+- [Creating Custom Visualizers](#creating-custom-visualizers)
+- [ES12+ Integration Patterns](#es12-integration-patterns)
+- [Audio Buffer Handling](#audio-buffer-handling)
+- [Performance Optimization](#performance-optimization)
+- [Troubleshooting](#troubleshooting)
+
+## Basic Integration
+
+### Standard Setup
+```html
+
+
+
+
+
+
+
+
+
+
+```
+
+### Node.js/Module Integration
+```javascript
+const Akko = require('akko');
+
+// Create instance
+const akko = new Akko({
+ containerId: 'my-container',
+ autoPlay: true
+});
+
+// Add custom visualizers
+akko.addVisualiser(new MyCustomVisualiser());
+
+// Add audio tracks
+akko.addTrack('./audio/track.mp3', 'My Track');
+
+akko.start();
+```
+
+## Modern JavaScript Features
+
+### ES12+ Integration Patterns
+
+#### Private Fields and Methods (ES2022)
+```javascript
+class ModernVisualiser extends Akko.Visualiser {
+ // Private fields
+ #particleSystem = null;
+ #animationTime = 0;
+ #config = {
+ particleCount: 1000,
+ colorScheme: 'rainbow'
+ };
+
+ constructor() {
+ super({
+ code: 'MOD',
+ name: 'Modern Visualiser',
+ fftSize: 256
+ });
+ }
+
+ // Private method
+ #updateParticles(audioData) {
+ // Safe audio processing with modern syntax
+ const bass = audioData?.frequencyData?.[0] / 255 ?? 0;
+ const treble = audioData?.frequencyData?.at(-1) / 255 ?? 0;
+
+ // Update logic here
+ }
+
+ onUpdate(data) {
+ this.#animationTime += 0.016;
+ this.#updateParticles(data);
+ }
+}
+```
+
+#### Optional Chaining and Nullish Coalescing
+```javascript
+class SafeVisualiser extends Akko.Visualiser {
+ onUpdate(data) {
+ // Safe property access
+ const audioLevel = data?.frequencyData?.[0] ?? 0;
+ const renderer = data?.renderer;
+
+ // Safe method calls
+ renderer?.render?.(this.scene, this.camera);
+
+ // Nullish coalescing for defaults
+ const particleCount = this.config?.particles ?? 1000;
+ const colorScheme = this.settings?.colors ?? 'default';
+ }
+}
+```
+
+#### Top-Level Await (ES2022)
+```javascript
+// In module context
+const audioContext = new AudioContext();
+const akko = new Akko({ audioContext });
+
+// Load visualizers dynamically
+const { ParticleVisualiser } = await import('./visualizers/particles.js');
+const { WaveVisualiser } = await import('./visualizers/waves.js');
+
+akko.addVisualiser(new ParticleVisualiser());
+akko.addVisualiser(new WaveVisualiser());
+
+await akko.start();
+```
+
+## Creating Custom Visualizers
+
+### Basic Visualizer Structure
+```javascript
+class CustomVisualiser extends Akko.Visualiser {
+ constructor() {
+ super({
+ code: 'CUS', // Unique 2-3 character code
+ name: 'Custom Viz', // Display name
+ fftSize: 256, // Audio analysis resolution
+ smoothingTimeConstant: 0.8 // Audio smoothing
+ });
+ }
+
+ // Required: Initialize your 3D scene
+ onInit(data) {
+ this.scene = new THREE.Scene();
+ this.camera = new THREE.PerspectiveCamera(
+ 75,
+ data.width / data.height,
+ 0.1,
+ 1000
+ );
+
+ // Setup your objects, lights, materials
+ this.setupScene();
+ }
+
+ // Required: Update animation each frame
+ onUpdate(data) {
+ // data.frequencyData: Uint8Array of frequency values (0-255)
+ // data.timeDomainData: Uint8Array of waveform values
+ // data.renderer: THREE.WebGLRenderer instance
+
+ this.animateObjects(data);
+ data.renderer.render(this.scene, this.camera);
+ }
+
+ // Required: Handle window resize
+ onResize(data) {
+ this.camera.aspect = data.width / data.height;
+ this.camera.updateProjectionMatrix();
+ }
+
+ // Required: Cleanup resources
+ onDestroy() {
+ // Dispose geometries, materials, textures
+ this.cleanup();
+ }
+}
+```
+
+### Advanced Visualizer with Controls
+```javascript
+class InteractiveVisualiser extends Akko.Visualiser {
+ #settings = {
+ particleCount: 1000,
+ colorScheme: 'rainbow',
+ sensitivity: 1.0
+ };
+
+ constructor() {
+ super({
+ code: 'INT',
+ name: 'Interactive Visualiser'
+ });
+ }
+
+ // Public API for external controls
+ setParticleCount(count) {
+ if (count >= 100 && count <= 5000) {
+ this.#settings.particleCount = count;
+ this.#recreateParticles();
+ }
+ }
+
+ setColorScheme(scheme) {
+ const validSchemes = ['rainbow', 'fire', 'ocean', 'neon'];
+ if (validSchemes.includes(scheme)) {
+ this.#settings.colorScheme = scheme;
+ }
+ }
+
+ setSensitivity(value) {
+ this.#settings.sensitivity = Math.max(0.1, Math.min(5.0, value));
+ }
+
+ // Private methods
+ #recreateParticles() {
+ // Recreate particle system with new count
+ }
+
+ #getColorForScheme(audioLevel, index) {
+ switch (this.#settings.colorScheme) {
+ case 'fire':
+ return new THREE.Color(1, audioLevel * 0.8, 0);
+ case 'ocean':
+ return new THREE.Color(0, audioLevel * 0.6, 1);
+ // ... other schemes
+ default:
+ return new THREE.Color().setHSL(
+ (index / 100 + audioLevel) % 1,
+ 0.8,
+ 0.6
+ );
+ }
+ }
+}
+```
+
+## ES12+ Integration Patterns
+
+### Wrapper Class Pattern
+```javascript
+class ES12AkkoManager {
+ #akkoInstance = null;
+ #visualizers = new Map();
+ #isInitialized = false;
+
+ constructor(options = {}) {
+ this.#akkoInstance = new Akko({
+ containerId: options.containerId ?? 'akko',
+ autoPlay: options.autoPlay ?? false,
+ useDefaultVisualisers: options.useDefaults ?? true
+ });
+ }
+
+ async init() {
+ try {
+ // Modern error handling
+ await this.#setupAudio();
+ this.#isInitialized = true;
+ console.log('✅ Akko initialized with ES12+ features');
+ } catch (error) {
+ console.error('❌ Initialization failed:', error);
+ throw error;
+ }
+ }
+
+ // Dynamic visualizer loading
+ async addVisualizer(visualizerPath, options = {}) {
+ try {
+ const { default: VisualizerClass } = await import(visualizerPath);
+ const visualizer = new VisualizerClass(options);
+
+ this.#akkoInstance?.addVisualiser?.(visualizer);
+ this.#visualizers.set(visualizer.code, visualizer);
+
+ console.log(`✅ Added ${visualizer.name}`);
+ return visualizer;
+ } catch (error) {
+ console.error(`❌ Failed to load ${visualizerPath}:`, error);
+ }
+ }
+
+ // Modern audio handling
+ async #setupAudio() {
+ if (!navigator.mediaDevices?.getUserMedia) {
+ throw new Error('Media devices not supported');
+ }
+
+ // Optional microphone access
+ try {
+ const stream = await navigator.mediaDevices.getUserMedia({
+ audio: true
+ });
+ console.log('🎤 Microphone access granted');
+ } catch {
+ console.log('🎵 Microphone access denied, file upload available');
+ }
+ }
+
+ // Getters with optional chaining
+ get isReady() {
+ return this.#isInitialized && this.#akkoInstance != null;
+ }
+
+ get visualizerCount() {
+ return this.#visualizers.size;
+ }
+}
+```
+
+### Control Panel Integration
+```javascript
+class VisualizerControls {
+ #visualizer = null;
+ #controlPanel = null;
+
+ constructor(visualizer, containerId) {
+ this.#visualizer = visualizer;
+ this.#createControls(containerId);
+ }
+
+ #createControls(containerId) {
+ const container = document.getElementById(containerId);
+ if (!container) return;
+
+ this.#controlPanel = document.createElement('div');
+ this.#controlPanel.className = 'visualizer-controls';
+
+ // Create controls based on visualizer capabilities
+ if (this.#visualizer.setParticleCount) {
+ this.#addSliderControl('Particles', 100, 2000, 1000,
+ value => this.#visualizer.setParticleCount(value)
+ );
+ }
+
+ if (this.#visualizer.setColorScheme) {
+ this.#addSelectControl('Color Scheme',
+ ['rainbow', 'fire', 'ocean', 'neon'],
+ scheme => this.#visualizer.setColorScheme(scheme)
+ );
+ }
+
+ container.appendChild(this.#controlPanel);
+ }
+
+ #addSliderControl(label, min, max, initial, callback) {
+ const group = document.createElement('div');
+ group.innerHTML = `
+
+
+ `;
+
+ const slider = group.querySelector('input');
+ const valueSpan = group.querySelector('.value');
+
+ slider.addEventListener('input', (e) => {
+ const value = parseInt(e.target.value);
+ valueSpan.textContent = value;
+ callback?.(value);
+ });
+
+ this.#controlPanel.appendChild(group);
+ }
+
+ #addSelectControl(label, options, callback) {
+ const group = document.createElement('div');
+ group.innerHTML = `
+
+
+ `;
+
+ const select = group.querySelector('select');
+ select.addEventListener('change', (e) => {
+ callback?.(e.target.value);
+ });
+
+ this.#controlPanel.appendChild(group);
+ }
+}
+```
+
+## Audio Buffer Handling
+
+### Safe Buffer Processing
+```javascript
+class SafeAudioHandler {
+ static async processAudioFile(file) {
+ try {
+ const arrayBuffer = await file.arrayBuffer();
+
+ // Clone buffer to prevent detachment (Akko v0.1.1 fix)
+ const clonedBuffer = arrayBuffer.slice(0);
+
+ const audioContext = new AudioContext();
+ const audioBuffer = await new Promise((resolve, reject) => {
+ audioContext.decodeAudioData(clonedBuffer, resolve, reject);
+ });
+
+ return audioBuffer;
+ } catch (error) {
+ console.error('Audio processing failed:', error);
+ throw new Error(`Failed to process audio: ${error.message}`);
+ }
+ }
+
+ static validateAudioData(data) {
+ if (!data?.frequencyData || !data?.timeDomainData) {
+ console.warn('Invalid audio data received');
+ return false;
+ }
+
+ // Check for NaN values
+ const hasNaN = Array.from(data.frequencyData).some(val => !isFinite(val));
+ if (hasNaN) {
+ console.warn('NaN values detected in audio data');
+ return false;
+ }
+
+ return true;
+ }
+}
+```
+
+## Performance Optimization
+
+### Efficient Particle Management
+```javascript
+class OptimizedParticleVisualiser extends Akko.Visualiser {
+ #particlePool = [];
+ #activeParticles = [];
+ #maxParticles = 1000;
+
+ constructor() {
+ super({ code: 'OPT', name: 'Optimized Particles' });
+ this.#initializePool();
+ }
+
+ #initializePool() {
+ // Pre-allocate particle objects
+ for (let i = 0; i < this.#maxParticles; i++) {
+ this.#particlePool.push({
+ position: new THREE.Vector3(),
+ velocity: new THREE.Vector3(),
+ life: 0,
+ maxLife: 1
+ });
+ }
+ }
+
+ #getParticle() {
+ return this.#particlePool.pop() || null;
+ }
+
+ #returnParticle(particle) {
+ particle.life = 0;
+ this.#particlePool.push(particle);
+ }
+
+ onUpdate(data) {
+ if (!SafeAudioHandler.validateAudioData(data)) return;
+
+ const audioLevel = data.frequencyData[0] / 255;
+
+ // Spawn particles based on audio
+ if (audioLevel > 0.1 && this.#particlePool.length > 0) {
+ const particle = this.#getParticle();
+ if (particle) {
+ this.#initializeParticle(particle, audioLevel);
+ this.#activeParticles.push(particle);
+ }
+ }
+
+ // Update active particles
+ this.#updateParticles(data);
+
+ // Render
+ data.renderer.render(this.scene, this.camera);
+ }
+
+ #updateParticles(data) {
+ for (let i = this.#activeParticles.length - 1; i >= 0; i--) {
+ const particle = this.#activeParticles[i];
+
+ particle.life += 0.016;
+ if (particle.life >= particle.maxLife) {
+ this.#activeParticles.splice(i, 1);
+ this.#returnParticle(particle);
+ } else {
+ this.#updateParticle(particle, data);
+ }
+ }
+ }
+}
+```
+
+### Memory Management
+```javascript
+class MemoryEfficientVisualiser extends Akko.Visualiser {
+ #geometries = new Set();
+ #materials = new Set();
+ #textures = new Set();
+
+ createGeometry() {
+ const geometry = new THREE.BufferGeometry();
+ this.#geometries.add(geometry);
+ return geometry;
+ }
+
+ createMaterial(options) {
+ const material = new THREE.MeshBasicMaterial(options);
+ this.#materials.add(material);
+ return material;
+ }
+
+ createTexture(source) {
+ const texture = new THREE.Texture(source);
+ this.#textures.add(texture);
+ return texture;
+ }
+
+ onDestroy() {
+ // Dispose all tracked resources
+ this.#geometries.forEach(geo => geo.dispose());
+ this.#materials.forEach(mat => mat.dispose());
+ this.#textures.forEach(tex => tex.dispose());
+
+ // Clear tracking sets
+ this.#geometries.clear();
+ this.#materials.clear();
+ this.#textures.clear();
+
+ console.log('🗑️ Resources cleaned up');
+ }
+}
+```
+
+## Troubleshooting
+
+### Common Issues and Solutions
+
+#### 1. "Akko is not a constructor"
+```javascript
+// Problem: Module loading issues
+// Solution: Ensure proper script loading order
+
+
+
+// Check if Akko is available
+if (typeof Akko !== 'function') {
+ console.error('Akko not loaded properly');
+}
+```
+
+#### 2. "NaN values in BufferGeometry"
+```javascript
+// Problem: Invalid position calculations
+// Solution: Add safety checks
+function safePosition(value, fallback = 0) {
+ return isFinite(value) ? value : fallback;
+}
+
+// In your visualizer
+positions[i] = safePosition(calculatedX);
+positions[i + 1] = safePosition(calculatedY);
+positions[i + 2] = safePosition(calculatedZ);
+```
+
+#### 3. Audio Buffer Detachment
+```javascript
+// Problem: ArrayBuffer becomes detached
+// Solution: Clone buffers (fixed in Akko v0.1.1)
+async function processAudio(file) {
+ const arrayBuffer = await file.arrayBuffer();
+ const clonedBuffer = arrayBuffer.slice(0); // Clone to prevent detachment
+ return audioContext.decodeAudioData(clonedBuffer);
+}
+```
+
+#### 4. Performance Issues
+```javascript
+// Problem: Too many particles/objects
+// Solution: Implement LOD (Level of Detail)
+class LODVisualiser extends Akko.Visualiser {
+ #getParticleCount(audioLevel) {
+ const baseCount = 500;
+ const maxCount = 2000;
+ const performance = this.#measurePerformance();
+
+ if (performance < 30) { // Low FPS
+ return Math.min(baseCount, baseCount * audioLevel);
+ }
+
+ return Math.min(maxCount, baseCount + (audioLevel * 1500));
+ }
+
+ #measurePerformance() {
+ // Simple FPS measurement
+ return this.lastFrameTime ? 1000 / this.lastFrameTime : 60;
+ }
+}
+```
+
+### Debug Helpers
+```javascript
+class AkkoDebugger {
+ static logAudioData(data) {
+ if (!data) return;
+
+ const freq = data.frequencyData;
+ const time = data.timeDomainData;
+
+ console.log('Audio Data:', {
+ frequencyRange: `${Math.min(...freq)} - ${Math.max(...freq)}`,
+ timeRange: `${Math.min(...time)} - ${Math.max(...time)}`,
+ avgFrequency: freq.reduce((a, b) => a + b) / freq.length,
+ hasNaN: Array.from(freq).some(v => !isFinite(v))
+ });
+ }
+
+ static validateVisualizer(visualizer) {
+ const required = ['onInit', 'onUpdate', 'onResize', 'onDestroy'];
+ const missing = required.filter(method =>
+ typeof visualizer[method] !== 'function'
+ );
+
+ if (missing.length > 0) {
+ console.error(`Visualizer missing methods: ${missing.join(', ')}`);
+ return false;
+ }
+
+ return true;
+ }
+}
+```
+
+## Best Practices
+
+1. **Always validate audio data** before processing
+2. **Use object pooling** for frequently created/destroyed objects
+3. **Implement proper cleanup** in `onDestroy()`
+4. **Add safety checks** for mathematical operations
+5. **Use modern JavaScript features** safely with fallbacks
+6. **Test with various audio sources** and edge cases
+7. **Monitor performance** and implement LOD when needed
+8. **Document your visualizer's public API** for control integration
+
+## Example Projects
+
+- **ES12+ Mixer**: `examples/es12-mixer/` - Complete modern JavaScript integration
+- **Custom Visualizers**: `lib/visualisers/` - Reference implementations
+- **Basic Examples**: `examples/` - Simple integration patterns
+
+For more examples and advanced patterns, see the [examples directory](./examples/) and the [ES12+ Mixer documentation](./examples/es12-mixer/README.md).
\ No newline at end of file
diff --git a/PR_SUMMARY.md b/PR_SUMMARY.md
new file mode 100644
index 0000000..46765c0
--- /dev/null
+++ b/PR_SUMMARY.md
@@ -0,0 +1,185 @@
+# Akko v0.1.1 - Audio Buffer Fixes, ES12+ Integration & Comprehensive Documentation
+
+## 🎯 Overview
+This PR introduces critical bug fixes, modern JavaScript integration patterns, and comprehensive documentation to make Akko more reliable and developer-friendly.
+
+## 🔧 Core Framework Fixes
+
+### Audio Buffer Handling (Critical Fix)
+- **Fixed ArrayBuffer detachment issues** in MusicPlayer that caused audio loading failures
+- **Added proper buffer cloning** to prevent detachment errors during audio processing
+- **Enhanced error handling** for audio decoding failures
+- **Improved track loading reliability** across different browsers and audio formats
+
+### Module System Improvements
+- **Resolved circular dependency issues** in visualiser modules (BarVisualiser, RingVisualiser)
+- **Fixed CommonJS/ES6 module compatibility** for better extensibility
+- **Improved webpack build process** for cleaner module exports
+- **Enhanced import/export patterns** following modern JavaScript standards
+
+## 🚀 New Features
+
+### ES12+ Integration Showcase
+- **ES12ParticleSwarmVisualiser**: Cutting-edge visualizer demonstrating modern JavaScript features
+ - Private fields and methods (ES2022)
+ - Optional chaining and nullish coalescing (ES2020)
+ - Safe math operations with finite value checks
+ - Advanced particle systems with swarm intelligence
+ - Audio-reactive explosion effects
+
+### Interactive Control System
+- **Real-time parameter adjustment** for visualizer properties
+- **Modern UI with glassmorphism design** matching futuristic aesthetics
+- **Three particle styles**: Points, Cubes, Spheres
+- **Five color schemes**: Rainbow, Fire, Ocean, Neon, Cyber
+- **Dynamic particle count control** (100-2000 particles)
+
+### ES12+ Mixer Example
+- **Complete demonstration** of modern JavaScript integration with Akko
+- **Professional UI/UX** with gradient effects and backdrop blur
+- **Educational value** showing best practices for extending Akko
+- **Browser compatibility** testing for ES12+ features
+
+## 📚 Documentation Enhancements
+
+### INTEGRATION.md (New)
+- **Comprehensive integration guide** for developers
+- **Modern JavaScript patterns** with ES12+ examples
+- **Custom visualizer development** templates and best practices
+- **Performance optimization** techniques and memory management
+- **Troubleshooting guide** with common issues and solutions
+- **Audio buffer handling** patterns and safety checks
+
+### CONTRIBUTING.md (New)
+- **Development setup** and project structure guide
+- **Code style guidelines** and best practices
+- **Testing procedures** across multiple browsers
+- **Pull request process** and community guidelines
+- **Release management** and version numbering
+
+### README.md Updates
+- **Proper changelog** focusing on framework improvements
+- **Clear distinction** between core fixes and example features
+- **Version history** with technical details
+- **Enhanced getting started** section
+
+## 🛠️ Technical Improvements
+
+### Build System
+- **Version bumped** to 0.1.1 in package.json
+- **Webpack banner** now shows correct version in built files
+- **Automated build process** with husky pre-commit hooks
+- **Clean dist artifacts** with proper minification
+
+### Code Quality
+- **Enhanced error handling** throughout the codebase
+- **Safety checks** for mathematical operations to prevent NaN errors
+- **Resource cleanup** patterns for memory management
+- **Performance monitoring** helpers and debugging tools
+
+### Browser Compatibility
+- **Chrome 94+**: Full ES12+ feature support
+- **Firefox 93+**: Modern JavaScript compatibility
+- **Safari 15+**: Private fields and optional chaining
+- **Edge 94+**: Complete feature set
+
+## 🎯 Impact
+
+### For Framework Users
+- **More reliable audio playback** - no more buffer detachment errors
+- **Better module architecture** - easier to extend and customize
+- **Modern JavaScript compatibility** - works with latest language features
+- **Enhanced developer experience** - comprehensive documentation and examples
+
+### For Developers
+- **Clear integration patterns** for modern JavaScript
+- **Comprehensive documentation** with practical examples
+- **Performance optimization** guidelines and best practices
+- **Professional development workflow** with proper tooling
+
+## 📁 Files Changed
+
+### Core Framework
+- `lib/MusicPlayer.js` - Audio buffer handling fixes
+- `lib/visualisers/BarVisualiser.js` - Fixed circular dependencies
+- `lib/visualisers/RingVisualiser.js` - Fixed circular dependencies
+- `package.json` - Version bump to 0.1.1
+
+### New Features
+- `lib/visualisers/ES12ParticleSwarmVisualiser.js` - Modern JavaScript visualizer
+- `examples/es12-mixer/` - Complete ES12+ integration example
+
+### Documentation
+- `INTEGRATION.md` - Developer integration guide
+- `CONTRIBUTING.md` - Contribution guidelines
+- `README.md` - Updated with changelog and improvements
+
+### Build System
+- `dist/akko.js` - Updated build with fixes
+- `dist/akko.css` - Updated styles
+- `webpack.config.js` - Build improvements
+
+## 🧪 Testing
+
+### 🚀 **Quick Testing for Maintainers**
+**Minimum verification (no server required):**
+```bash
+# Open directly in browser
+firefox examples/akko-inline.html
+```
+- ✅ Verifies core framework fixes work
+- ✅ Tests visualizer switching and UI
+- ✅ Confirms no "Akko is not a constructor" errors
+- ✅ Drag & drop audio testing available
+
+### 🌐 **Full Testing (Server Required)**
+**For complete feature testing:**
+```bash
+npm run examples
+# Visit: http://localhost:8080/examples/es12-mixer/
+```
+
+### 📋 **Testing Documentation**
+- **TESTING.md**: Comprehensive guide for maintainers
+- **Server requirements**: Clearly documented for ES12+ examples
+- **Browser compatibility**: Detailed compatibility matrix
+- **Troubleshooting**: Common issues and solutions
+
+### Manual Testing Completed
+- ✅ Audio file loading and playback across browsers
+- ✅ Drag & drop functionality
+- ✅ Visualizer switching and controls
+- ✅ Window resize handling
+- ✅ Error scenarios (invalid files, no audio permission)
+- ✅ ES12+ features in modern browsers
+- ✅ Performance with various particle counts
+
+### Browser Compatibility Verified
+- ✅ Chrome (latest) - Full functionality
+- ✅ Firefox (latest) - Full functionality
+- ✅ Safari (latest) - ES12+ features working
+- ✅ Edge (latest) - Complete compatibility
+
+## 🔄 Migration Guide
+
+### For Existing Users
+No breaking changes - this is a backwards-compatible update that fixes existing issues.
+
+### For Developers Extending Akko
+- Use the new integration patterns in `INTEGRATION.md`
+- Follow the safety patterns for audio buffer handling
+- Leverage modern JavaScript features safely with provided examples
+
+## 🎉 Benefits Summary
+
+1. **🔧 Reliability**: Fixed critical audio buffer issues affecting all users
+2. **🚀 Modernization**: Showcased cutting-edge JavaScript integration
+3. **📚 Documentation**: Comprehensive guides for developers
+4. **🎨 Examples**: Professional-quality demonstration of capabilities
+5. **🛠️ Developer Experience**: Enhanced tooling and development workflow
+
+This release makes Akko more reliable, modern, and developer-friendly while maintaining full backwards compatibility.
+
+---
+
+**Ready for review and merge!** 🎵✨
\ No newline at end of file
diff --git a/README.md b/README.md
index a990ee9..dc95a99 100644
--- a/README.md
+++ b/README.md
@@ -84,6 +84,37 @@ Then:
const Akko = require('akko');
```
+# Changelog
+
+## Version 0.1.1 (Latest Build)
+
+### 🔧 Core Framework Fixes
+- **Fixed audio buffer handling**: Resolved ArrayBuffer detachment issues in MusicPlayer
+ - Added proper buffer cloning to prevent detachment errors
+ - Improved error handling for audio decoding failures
+ - Enhanced track loading reliability
+
+### 🛠️ Module System Improvements
+- **Fixed circular dependency issues** in visualiser modules
+ - Updated BarVisualiser, RingVisualiser to import Visualiser directly
+ - Resolved CommonJS/ES6 module compatibility issues
+ - Improved webpack build process
+
+### 📦 New Example: ES12+ Mixer
+- **Added comprehensive ES12+ demonstration** showcasing modern JavaScript integration
+ - ES12ParticleSwarmVisualiser with private fields, optional chaining, nullish coalescing
+ - Interactive control panel for real-time parameter adjustment
+ - Modern UI with glassmorphism design
+ - Demonstrates how to extend Akko with cutting-edge JavaScript features
+
+### 🎯 Key Framework Benefits
+- **More reliable audio playback** - no more buffer detachment errors
+- **Better module architecture** - cleaner imports and exports
+- **Modern JavaScript compatibility** - works with latest language features
+- **Enhanced developer experience** - easier to extend and customize
+
+---
+
# Contributing
This project is still in its early development phase, so a lot of things are likely to change. If you want to extend the source code, please [create a new issue](https://github.com/TimboKZ/Akko/issues) so we can discuss the changes you want to make before you start.
diff --git a/TESTING.md b/TESTING.md
new file mode 100644
index 0000000..e877e5c
--- /dev/null
+++ b/TESTING.md
@@ -0,0 +1,192 @@
+# Testing Guide for Akko v0.1.1
+
+This guide helps maintainers and contributors test the Akko framework and examples properly.
+
+## 🚀 Quick Start Testing
+
+### Option 1: Direct Browser Testing (Fastest)
+```bash
+# Open any basic example directly in browser
+firefox examples/akko-inline.html
+# or
+chrome examples/akko-fullscreen.html
+```
+
+**What works:**
+- ✅ Akko framework loads and initializes
+- ✅ UI controls appear and function
+- ✅ Visualizer switching works
+- ✅ Drag & drop audio files works
+- ❌ Pre-loaded demo audio files won't load (CORS limitation)
+
+**This is sufficient to verify the core framework fixes!**
+
+### Option 2: Full Server Testing (Complete)
+```bash
+# Install dependencies
+npm install
+
+# Start development server
+npm run examples
+
+# Open in browser
+http://localhost:8080/examples/
+```
+
+**What works:**
+- ✅ Everything from Option 1
+- ✅ Pre-loaded demo audio files work
+- ✅ ES12+ examples with modules work
+- ✅ All audio loading methods work
+
+## 📁 Example Categories
+
+### 🟢 Basic Examples (Work without server)
+| File | Description | Server Required |
+|------|-------------|-----------------|
+| `akko-inline.html` | Inline Akko on a page | No |
+| `akko-fullscreen.html` | Fullscreen visualization | No |
+| `akko-custom-es5.html` | Custom visualizer (ES5) | No |
+| `akko-custom-es6.html` | Custom visualizer (ES6) | No |
+
+**Testing:** Open directly in browser via `file://` protocol
+
+### 🟡 Advanced Examples (Require server)
+| File | Description | Server Required |
+|------|-------------|-----------------|
+| `akko-custom-es12.html` | ES12+ features demo | Yes |
+| `es12-mixer/index.html` | Complete ES12+ showcase | Yes |
+
+**Testing:** Requires HTTP server due to ES modules and CORS
+
+## 🔧 Core Framework Testing
+
+### 1. Audio Buffer Fix Verification
+```javascript
+// Test that this no longer throws "ArrayBuffer detached" error
+akko.addTrack('./audio/test.mp3');
+```
+
+**Expected:** Audio loads successfully without buffer errors
+
+### 2. Module System Fix Verification
+```javascript
+// Test that visualizers load without circular dependency errors
+const akko = new Akko();
+akko.start(); // Should not throw module loading errors
+```
+
+**Expected:** No "circular dependency" or "module not found" errors
+
+### 3. ES12+ Integration Testing
+**File:** `examples/es12-mixer/index.html`
+
+**Requirements:**
+- Modern browser (Chrome 94+, Firefox 93+, Safari 15+, Edge 94+)
+- HTTP server (for ES modules)
+
+**Test Steps:**
+1. Click "Launch Future" button
+2. Verify ES12+ Particle Swarm visualizer loads
+3. Test control panel (top-right corner):
+ - Particle Style: Points/Cubes/Spheres
+ - Color Scheme: Rainbow/Fire/Ocean/Neon/Cyber
+ - Particle Count: 100-2000 slider
+4. Verify real-time parameter changes work
+
+**Expected:** No console errors, smooth visualization, responsive controls
+
+## 🐛 Common Issues & Solutions
+
+### Issue: "Akko is not a constructor"
+**Cause:** Script loading order or path issues
+**Solution:** Ensure THREE.js loads before Akko
+```html
+
+
+```
+
+### Issue: "CORS error" when loading audio
+**Cause:** File protocol limitations
+**Solution:** Use HTTP server or drag & drop audio files
+
+### Issue: "ES modules not supported"
+**Cause:** File protocol or old browser
+**Solution:** Use HTTP server and modern browser
+
+### Issue: "NaN values in BufferGeometry"
+**Cause:** Math errors in particle calculations (fixed in v0.1.1)
+**Solution:** Update to latest build
+
+## 📊 Browser Compatibility
+
+### Core Framework (All Examples)
+- ✅ Chrome 60+
+- ✅ Firefox 55+
+- ✅ Safari 12+
+- ✅ Edge 79+
+
+### ES12+ Examples
+- ✅ Chrome 94+ (Full ES12+ support)
+- ✅ Firefox 93+ (Modern JavaScript)
+- ✅ Safari 15+ (Private fields, optional chaining)
+- ✅ Edge 94+ (Complete feature set)
+
+## 🎯 Minimal Testing for PR Review
+
+**For maintainers reviewing this PR, minimum testing:**
+
+1. **Open `examples/akko-inline.html` directly in browser**
+2. **Verify Akko loads without errors**
+3. **Test visualizer switching**
+4. **Drag & drop an audio file**
+
+**This confirms the core framework fixes work correctly.**
+
+## 🚀 Advanced Testing (Optional)
+
+**For full feature testing:**
+
+1. **Start server:** `npm run examples`
+2. **Test ES12+ mixer:** `http://localhost:8080/examples/es12-mixer/`
+3. **Verify all controls work**
+4. **Test with different audio files**
+
+## 📝 Testing Checklist
+
+### Core Framework
+- [ ] Akko loads without "constructor" errors
+- [ ] Audio files load without "ArrayBuffer detached" errors
+- [ ] Visualizers switch without module errors
+- [ ] Drag & drop functionality works
+- [ ] UI controls respond properly
+
+### ES12+ Features (Server Required)
+- [ ] ES12+ mixer loads without errors
+- [ ] Particle controls work in real-time
+- [ ] Modern JavaScript features function correctly
+- [ ] No console errors in modern browsers
+
+### Cross-Browser
+- [ ] Chrome (latest)
+- [ ] Firefox (latest)
+- [ ] Safari (if available)
+- [ ] Edge (latest)
+
+## 💡 Tips for Maintainers
+
+1. **Quick verification:** Just open `akko-inline.html` in browser
+2. **Audio testing:** Drag & drop your own MP3 file
+3. **ES12+ testing:** Requires `npm run examples` server
+4. **Mobile testing:** Basic examples work on mobile browsers
+
+## 🆘 Getting Help
+
+If you encounter issues:
+
+1. **Check browser console** for error messages
+2. **Verify file paths** are correct for your setup
+3. **Try different browsers** for compatibility
+4. **Use HTTP server** for full functionality
+
+The core framework improvements work regardless of server setup!
\ No newline at end of file
diff --git a/bun.lock b/bun.lock
new file mode 100644
index 0000000..d171f91
--- /dev/null
+++ b/bun.lock
@@ -0,0 +1,1546 @@
+{
+ "lockfileVersion": 1,
+ "workspaces": {
+ "": {
+ "name": "akko",
+ "dependencies": {
+ "bluebird": "^3.5.0",
+ "element-resize-event": "^2.0.9",
+ "preact": "^8.2.1",
+ "sass": "^1.89.2",
+ "three": "^0.86.0",
+ },
+ "devDependencies": {
+ "@babel/core": "^7.28.0",
+ "@babel/preset-env": "^7.28.0",
+ "@types/three": "^0.84.19",
+ "babel-core": "^6.25.0",
+ "babel-loader": "^10.0.0",
+ "babel-plugin-transform-react-jsx": "^6.24.1",
+ "babel-preset-env": "^1.6.0",
+ "css-loader": "^7.1.2",
+ "css-minimizer-webpack-plugin": "^7.0.2",
+ "eslint": "^4.5.0",
+ "extract-text-webpack-plugin": "^3.0.0",
+ "http-server": "^0.10.0",
+ "husky": "^0.14.3",
+ "mini-css-extract-plugin": "^2.9.2",
+ "nightmare": "^2.10.0",
+ "sass-loader": "^16.0.5",
+ "terser-webpack-plugin": "^5.3.14",
+ "uglifyjs-webpack-plugin": "^0.4.6",
+ "webpack": "^5.100.2",
+ "webpack-cli": "^6.0.1",
+ "whatwg-fetch": "^2.0.3",
+ },
+ },
+ },
+ "trustedDependencies": [
+ "husky",
+ "@parcel/watcher",
+ "core-js",
+ "uglifyjs-webpack-plugin",
+ "preact",
+ ],
+ "packages": {
+ "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="],
+
+ "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="],
+
+ "@babel/compat-data": ["@babel/compat-data@7.28.0", "", {}, "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw=="],
+
+ "@babel/core": ["@babel/core@7.28.0", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.27.3", "@babel/helpers": "^7.27.6", "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.0", "@babel/types": "^7.28.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ=="],
+
+ "@babel/generator": ["@babel/generator@7.28.0", "", { "dependencies": { "@babel/parser": "^7.28.0", "@babel/types": "^7.28.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg=="],
+
+ "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" } }, "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="],
+
+ "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.2", "", { "dependencies": { "@babel/compat-data": "^7.27.2", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ=="],
+
+ "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.27.1", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A=="],
+
+ "@babel/helper-create-regexp-features-plugin": ["@babel/helper-create-regexp-features-plugin@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "regexpu-core": "^6.2.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ=="],
+
+ "@babel/helper-define-polyfill-provider": ["@babel/helper-define-polyfill-provider@0.6.5", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "debug": "^4.4.1", "lodash.debounce": "^4.0.8", "resolve": "^1.22.10" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg=="],
+
+ "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="],
+
+ "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA=="],
+
+ "@babel/helper-module-imports": ["@babel/helper-module-imports@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="],
+
+ "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.27.3", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.27.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg=="],
+
+ "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.27.1", "", { "dependencies": { "@babel/types": "^7.27.1" } }, "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw=="],
+
+ "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.27.1", "", {}, "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw=="],
+
+ "@babel/helper-remap-async-to-generator": ["@babel/helper-remap-async-to-generator@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-wrap-function": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA=="],
+
+ "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.27.1", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA=="],
+
+ "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg=="],
+
+ "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="],
+
+ "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="],
+
+ "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="],
+
+ "@babel/helper-wrap-function": ["@babel/helper-wrap-function@7.27.1", "", { "dependencies": { "@babel/template": "^7.27.1", "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ=="],
+
+ "@babel/helpers": ["@babel/helpers@7.27.6", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.27.6" } }, "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug=="],
+
+ "@babel/parser": ["@babel/parser@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.0" }, "bin": "./bin/babel-parser.js" }, "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g=="],
+
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key": ["@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA=="],
+
+ "@babel/plugin-bugfix-safari-class-field-initializer-scope": ["@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA=="],
+
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ["@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA=="],
+
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ["@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-transform-optional-chaining": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.13.0" } }, "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw=="],
+
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": ["@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw=="],
+
+ "@babel/plugin-proposal-private-property-in-object": ["@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w=="],
+
+ "@babel/plugin-syntax-import-assertions": ["@babel/plugin-syntax-import-assertions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg=="],
+
+ "@babel/plugin-syntax-import-attributes": ["@babel/plugin-syntax-import-attributes@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww=="],
+
+ "@babel/plugin-syntax-unicode-sets-regex": ["@babel/plugin-syntax-unicode-sets-regex@7.18.6", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg=="],
+
+ "@babel/plugin-transform-arrow-functions": ["@babel/plugin-transform-arrow-functions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA=="],
+
+ "@babel/plugin-transform-async-generator-functions": ["@babel/plugin-transform-async-generator-functions@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1", "@babel/traverse": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q=="],
+
+ "@babel/plugin-transform-async-to-generator": ["@babel/plugin-transform-async-to-generator@7.27.1", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA=="],
+
+ "@babel/plugin-transform-block-scoped-functions": ["@babel/plugin-transform-block-scoped-functions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg=="],
+
+ "@babel/plugin-transform-block-scoping": ["@babel/plugin-transform-block-scoping@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q=="],
+
+ "@babel/plugin-transform-class-properties": ["@babel/plugin-transform-class-properties@7.27.1", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA=="],
+
+ "@babel/plugin-transform-class-static-block": ["@babel/plugin-transform-class-static-block@7.27.1", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.12.0" } }, "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA=="],
+
+ "@babel/plugin-transform-classes": ["@babel/plugin-transform-classes@7.28.0", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/traverse": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA=="],
+
+ "@babel/plugin-transform-computed-properties": ["@babel/plugin-transform-computed-properties@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/template": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw=="],
+
+ "@babel/plugin-transform-destructuring": ["@babel/plugin-transform-destructuring@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A=="],
+
+ "@babel/plugin-transform-dotall-regex": ["@babel/plugin-transform-dotall-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw=="],
+
+ "@babel/plugin-transform-duplicate-keys": ["@babel/plugin-transform-duplicate-keys@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q=="],
+
+ "@babel/plugin-transform-duplicate-named-capturing-groups-regex": ["@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ=="],
+
+ "@babel/plugin-transform-dynamic-import": ["@babel/plugin-transform-dynamic-import@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A=="],
+
+ "@babel/plugin-transform-explicit-resource-management": ["@babel/plugin-transform-explicit-resource-management@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ=="],
+
+ "@babel/plugin-transform-exponentiation-operator": ["@babel/plugin-transform-exponentiation-operator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ=="],
+
+ "@babel/plugin-transform-export-namespace-from": ["@babel/plugin-transform-export-namespace-from@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ=="],
+
+ "@babel/plugin-transform-for-of": ["@babel/plugin-transform-for-of@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw=="],
+
+ "@babel/plugin-transform-function-name": ["@babel/plugin-transform-function-name@7.27.1", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ=="],
+
+ "@babel/plugin-transform-json-strings": ["@babel/plugin-transform-json-strings@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q=="],
+
+ "@babel/plugin-transform-literals": ["@babel/plugin-transform-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA=="],
+
+ "@babel/plugin-transform-logical-assignment-operators": ["@babel/plugin-transform-logical-assignment-operators@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw=="],
+
+ "@babel/plugin-transform-member-expression-literals": ["@babel/plugin-transform-member-expression-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ=="],
+
+ "@babel/plugin-transform-modules-amd": ["@babel/plugin-transform-modules-amd@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA=="],
+
+ "@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw=="],
+
+ "@babel/plugin-transform-modules-systemjs": ["@babel/plugin-transform-modules-systemjs@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA=="],
+
+ "@babel/plugin-transform-modules-umd": ["@babel/plugin-transform-modules-umd@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w=="],
+
+ "@babel/plugin-transform-named-capturing-groups-regex": ["@babel/plugin-transform-named-capturing-groups-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng=="],
+
+ "@babel/plugin-transform-new-target": ["@babel/plugin-transform-new-target@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ=="],
+
+ "@babel/plugin-transform-nullish-coalescing-operator": ["@babel/plugin-transform-nullish-coalescing-operator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA=="],
+
+ "@babel/plugin-transform-numeric-separator": ["@babel/plugin-transform-numeric-separator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw=="],
+
+ "@babel/plugin-transform-object-rest-spread": ["@babel/plugin-transform-object-rest-spread@7.28.0", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/traverse": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA=="],
+
+ "@babel/plugin-transform-object-super": ["@babel/plugin-transform-object-super@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng=="],
+
+ "@babel/plugin-transform-optional-catch-binding": ["@babel/plugin-transform-optional-catch-binding@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q=="],
+
+ "@babel/plugin-transform-optional-chaining": ["@babel/plugin-transform-optional-chaining@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg=="],
+
+ "@babel/plugin-transform-parameters": ["@babel/plugin-transform-parameters@7.27.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg=="],
+
+ "@babel/plugin-transform-private-methods": ["@babel/plugin-transform-private-methods@7.27.1", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA=="],
+
+ "@babel/plugin-transform-private-property-in-object": ["@babel/plugin-transform-private-property-in-object@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ=="],
+
+ "@babel/plugin-transform-property-literals": ["@babel/plugin-transform-property-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ=="],
+
+ "@babel/plugin-transform-regenerator": ["@babel/plugin-transform-regenerator@7.28.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-P0QiV/taaa3kXpLY+sXla5zec4E+4t4Aqc9ggHlfZ7a2cp8/x/Gv08jfwEtn9gnnYIMvHx6aoOZ8XJL8eU71Dg=="],
+
+ "@babel/plugin-transform-regexp-modifiers": ["@babel/plugin-transform-regexp-modifiers@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA=="],
+
+ "@babel/plugin-transform-reserved-words": ["@babel/plugin-transform-reserved-words@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw=="],
+
+ "@babel/plugin-transform-shorthand-properties": ["@babel/plugin-transform-shorthand-properties@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ=="],
+
+ "@babel/plugin-transform-spread": ["@babel/plugin-transform-spread@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q=="],
+
+ "@babel/plugin-transform-sticky-regex": ["@babel/plugin-transform-sticky-regex@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g=="],
+
+ "@babel/plugin-transform-template-literals": ["@babel/plugin-transform-template-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg=="],
+
+ "@babel/plugin-transform-typeof-symbol": ["@babel/plugin-transform-typeof-symbol@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw=="],
+
+ "@babel/plugin-transform-unicode-escapes": ["@babel/plugin-transform-unicode-escapes@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg=="],
+
+ "@babel/plugin-transform-unicode-property-regex": ["@babel/plugin-transform-unicode-property-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q=="],
+
+ "@babel/plugin-transform-unicode-regex": ["@babel/plugin-transform-unicode-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw=="],
+
+ "@babel/plugin-transform-unicode-sets-regex": ["@babel/plugin-transform-unicode-sets-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw=="],
+
+ "@babel/preset-env": ["@babel/preset-env@7.28.0", "", { "dependencies": { "@babel/compat-data": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-import-assertions": "^7.27.1", "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.27.1", "@babel/plugin-transform-async-generator-functions": "^7.28.0", "@babel/plugin-transform-async-to-generator": "^7.27.1", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", "@babel/plugin-transform-block-scoping": "^7.28.0", "@babel/plugin-transform-class-properties": "^7.27.1", "@babel/plugin-transform-class-static-block": "^7.27.1", "@babel/plugin-transform-classes": "^7.28.0", "@babel/plugin-transform-computed-properties": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-dotall-regex": "^7.27.1", "@babel/plugin-transform-duplicate-keys": "^7.27.1", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-dynamic-import": "^7.27.1", "@babel/plugin-transform-explicit-resource-management": "^7.28.0", "@babel/plugin-transform-exponentiation-operator": "^7.27.1", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", "@babel/plugin-transform-function-name": "^7.27.1", "@babel/plugin-transform-json-strings": "^7.27.1", "@babel/plugin-transform-literals": "^7.27.1", "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", "@babel/plugin-transform-member-expression-literals": "^7.27.1", "@babel/plugin-transform-modules-amd": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", "@babel/plugin-transform-modules-systemjs": "^7.27.1", "@babel/plugin-transform-modules-umd": "^7.27.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-new-target": "^7.27.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", "@babel/plugin-transform-numeric-separator": "^7.27.1", "@babel/plugin-transform-object-rest-spread": "^7.28.0", "@babel/plugin-transform-object-super": "^7.27.1", "@babel/plugin-transform-optional-catch-binding": "^7.27.1", "@babel/plugin-transform-optional-chaining": "^7.27.1", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-property-literals": "^7.27.1", "@babel/plugin-transform-regenerator": "^7.28.0", "@babel/plugin-transform-regexp-modifiers": "^7.27.1", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", "@babel/plugin-transform-spread": "^7.27.1", "@babel/plugin-transform-sticky-regex": "^7.27.1", "@babel/plugin-transform-template-literals": "^7.27.1", "@babel/plugin-transform-typeof-symbol": "^7.27.1", "@babel/plugin-transform-unicode-escapes": "^7.27.1", "@babel/plugin-transform-unicode-property-regex": "^7.27.1", "@babel/plugin-transform-unicode-regex": "^7.27.1", "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.14", "babel-plugin-polyfill-corejs3": "^0.13.0", "babel-plugin-polyfill-regenerator": "^0.6.5", "core-js-compat": "^3.43.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg=="],
+
+ "@babel/preset-modules": ["@babel/preset-modules@0.1.6-no-external-plugins", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, "peerDependencies": { "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA=="],
+
+ "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="],
+
+ "@babel/traverse": ["@babel/traverse@7.28.0", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.0", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", "@babel/types": "^7.28.0", "debug": "^4.3.1" } }, "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg=="],
+
+ "@babel/types": ["@babel/types@7.28.1", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ=="],
+
+ "@discoveryjs/json-ext": ["@discoveryjs/json-ext@0.6.3", "", {}, "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ=="],
+
+ "@jest/schemas": ["@jest/schemas@29.6.3", "", { "dependencies": { "@sinclair/typebox": "^0.27.8" } }, "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA=="],
+
+ "@jest/types": ["@jest/types@29.6.3", "", { "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw=="],
+
+ "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.12", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg=="],
+
+ "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
+
+ "@jridgewell/source-map": ["@jridgewell/source-map@0.3.10", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q=="],
+
+ "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.4", "", {}, "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw=="],
+
+ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.29", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ=="],
+
+ "@parcel/watcher": ["@parcel/watcher@2.5.1", "", { "dependencies": { "detect-libc": "^1.0.3", "is-glob": "^4.0.3", "micromatch": "^4.0.5", "node-addon-api": "^7.0.0" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.1", "@parcel/watcher-darwin-arm64": "2.5.1", "@parcel/watcher-darwin-x64": "2.5.1", "@parcel/watcher-freebsd-x64": "2.5.1", "@parcel/watcher-linux-arm-glibc": "2.5.1", "@parcel/watcher-linux-arm-musl": "2.5.1", "@parcel/watcher-linux-arm64-glibc": "2.5.1", "@parcel/watcher-linux-arm64-musl": "2.5.1", "@parcel/watcher-linux-x64-glibc": "2.5.1", "@parcel/watcher-linux-x64-musl": "2.5.1", "@parcel/watcher-win32-arm64": "2.5.1", "@parcel/watcher-win32-ia32": "2.5.1", "@parcel/watcher-win32-x64": "2.5.1" } }, "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg=="],
+
+ "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.5.1", "", { "os": "android", "cpu": "arm64" }, "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA=="],
+
+ "@parcel/watcher-darwin-arm64": ["@parcel/watcher-darwin-arm64@2.5.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw=="],
+
+ "@parcel/watcher-darwin-x64": ["@parcel/watcher-darwin-x64@2.5.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg=="],
+
+ "@parcel/watcher-freebsd-x64": ["@parcel/watcher-freebsd-x64@2.5.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ=="],
+
+ "@parcel/watcher-linux-arm-glibc": ["@parcel/watcher-linux-arm-glibc@2.5.1", "", { "os": "linux", "cpu": "arm" }, "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA=="],
+
+ "@parcel/watcher-linux-arm-musl": ["@parcel/watcher-linux-arm-musl@2.5.1", "", { "os": "linux", "cpu": "arm" }, "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q=="],
+
+ "@parcel/watcher-linux-arm64-glibc": ["@parcel/watcher-linux-arm64-glibc@2.5.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w=="],
+
+ "@parcel/watcher-linux-arm64-musl": ["@parcel/watcher-linux-arm64-musl@2.5.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg=="],
+
+ "@parcel/watcher-linux-x64-glibc": ["@parcel/watcher-linux-x64-glibc@2.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A=="],
+
+ "@parcel/watcher-linux-x64-musl": ["@parcel/watcher-linux-x64-musl@2.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg=="],
+
+ "@parcel/watcher-win32-arm64": ["@parcel/watcher-win32-arm64@2.5.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw=="],
+
+ "@parcel/watcher-win32-ia32": ["@parcel/watcher-win32-ia32@2.5.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ=="],
+
+ "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.5.1", "", { "os": "win32", "cpu": "x64" }, "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA=="],
+
+ "@sinclair/typebox": ["@sinclair/typebox@0.27.8", "", {}, "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA=="],
+
+ "@types/eslint": ["@types/eslint@9.6.1", "", { "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag=="],
+
+ "@types/eslint-scope": ["@types/eslint-scope@3.7.7", "", { "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg=="],
+
+ "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
+
+ "@types/istanbul-lib-coverage": ["@types/istanbul-lib-coverage@2.0.6", "", {}, "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w=="],
+
+ "@types/istanbul-lib-report": ["@types/istanbul-lib-report@3.0.3", "", { "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA=="],
+
+ "@types/istanbul-reports": ["@types/istanbul-reports@3.0.4", "", { "dependencies": { "@types/istanbul-lib-report": "*" } }, "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ=="],
+
+ "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
+
+ "@types/node": ["@types/node@8.10.66", "", {}, "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw=="],
+
+ "@types/three": ["@types/three@0.84.37", "", { "dependencies": { "@types/webvr-api": "*" } }, "sha512-lzekwNCdEEkGAts0iVHQb6sMGl3LzwFfqAcxyGMpNwkSGx9NN0EfDiBax2HGoELSahqnSehVKScyHKLONytFCw=="],
+
+ "@types/webvr-api": ["@types/webvr-api@0.0.41", "", {}, "sha512-QCGGQR2kpzXLIifvXpPghGMsINT8J4G+qhGungG3AH7P4BgBedRvG9OknttF2prCGLY4iSU1hxchddGC5g99uA=="],
+
+ "@types/yargs": ["@types/yargs@17.0.33", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA=="],
+
+ "@types/yargs-parser": ["@types/yargs-parser@21.0.3", "", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="],
+
+ "@webassemblyjs/ast": ["@webassemblyjs/ast@1.14.1", "", { "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ=="],
+
+ "@webassemblyjs/floating-point-hex-parser": ["@webassemblyjs/floating-point-hex-parser@1.13.2", "", {}, "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA=="],
+
+ "@webassemblyjs/helper-api-error": ["@webassemblyjs/helper-api-error@1.13.2", "", {}, "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ=="],
+
+ "@webassemblyjs/helper-buffer": ["@webassemblyjs/helper-buffer@1.14.1", "", {}, "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA=="],
+
+ "@webassemblyjs/helper-numbers": ["@webassemblyjs/helper-numbers@1.13.2", "", { "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA=="],
+
+ "@webassemblyjs/helper-wasm-bytecode": ["@webassemblyjs/helper-wasm-bytecode@1.13.2", "", {}, "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA=="],
+
+ "@webassemblyjs/helper-wasm-section": ["@webassemblyjs/helper-wasm-section@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/wasm-gen": "1.14.1" } }, "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw=="],
+
+ "@webassemblyjs/ieee754": ["@webassemblyjs/ieee754@1.13.2", "", { "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw=="],
+
+ "@webassemblyjs/leb128": ["@webassemblyjs/leb128@1.13.2", "", { "dependencies": { "@xtuc/long": "4.2.2" } }, "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw=="],
+
+ "@webassemblyjs/utf8": ["@webassemblyjs/utf8@1.13.2", "", {}, "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ=="],
+
+ "@webassemblyjs/wasm-edit": ["@webassemblyjs/wasm-edit@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/helper-wasm-section": "1.14.1", "@webassemblyjs/wasm-gen": "1.14.1", "@webassemblyjs/wasm-opt": "1.14.1", "@webassemblyjs/wasm-parser": "1.14.1", "@webassemblyjs/wast-printer": "1.14.1" } }, "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ=="],
+
+ "@webassemblyjs/wasm-gen": ["@webassemblyjs/wasm-gen@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/ieee754": "1.13.2", "@webassemblyjs/leb128": "1.13.2", "@webassemblyjs/utf8": "1.13.2" } }, "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg=="],
+
+ "@webassemblyjs/wasm-opt": ["@webassemblyjs/wasm-opt@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", "@webassemblyjs/wasm-gen": "1.14.1", "@webassemblyjs/wasm-parser": "1.14.1" } }, "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw=="],
+
+ "@webassemblyjs/wasm-parser": ["@webassemblyjs/wasm-parser@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-api-error": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/ieee754": "1.13.2", "@webassemblyjs/leb128": "1.13.2", "@webassemblyjs/utf8": "1.13.2" } }, "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ=="],
+
+ "@webassemblyjs/wast-printer": ["@webassemblyjs/wast-printer@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw=="],
+
+ "@webpack-cli/configtest": ["@webpack-cli/configtest@3.0.1", "", { "peerDependencies": { "webpack": "^5.82.0", "webpack-cli": "6.x.x" } }, "sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA=="],
+
+ "@webpack-cli/info": ["@webpack-cli/info@3.0.1", "", { "peerDependencies": { "webpack": "^5.82.0", "webpack-cli": "6.x.x" } }, "sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ=="],
+
+ "@webpack-cli/serve": ["@webpack-cli/serve@3.0.1", "", { "peerDependencies": { "webpack": "^5.82.0", "webpack-cli": "6.x.x" } }, "sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg=="],
+
+ "@xtuc/ieee754": ["@xtuc/ieee754@1.2.0", "", {}, "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="],
+
+ "@xtuc/long": ["@xtuc/long@4.2.2", "", {}, "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="],
+
+ "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="],
+
+ "acorn-import-phases": ["acorn-import-phases@1.0.4", "", { "peerDependencies": { "acorn": "^8.14.0" } }, "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ=="],
+
+ "acorn-jsx": ["acorn-jsx@3.0.1", "", { "dependencies": { "acorn": "^3.0.4" } }, "sha512-AU7pnZkguthwBjKgCg6998ByQNIMjbuDQZ8bb78QAFZwPfmKia8AIzgY/gWgqCjnht8JLdXmB4YxA0KaV60ncQ=="],
+
+ "ajv": ["ajv@5.5.2", "", { "dependencies": { "co": "^4.6.0", "fast-deep-equal": "^1.0.0", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.3.0" } }, "sha512-Ajr4IcMXq/2QmMkEmSvxqfLN5zGmJ92gHXAeOXq1OekoH2rfDNsgdDoL2f7QaRCy7G/E6TpxBVdRuNraMztGHw=="],
+
+ "ajv-formats": ["ajv-formats@2.1.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA=="],
+
+ "ajv-keywords": ["ajv-keywords@5.1.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw=="],
+
+ "align-text": ["align-text@0.1.4", "", { "dependencies": { "kind-of": "^3.0.2", "longest": "^1.0.1", "repeat-string": "^1.5.2" } }, "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg=="],
+
+ "ansi-escapes": ["ansi-escapes@3.2.0", "", {}, "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ=="],
+
+ "ansi-regex": ["ansi-regex@3.0.1", "", {}, "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw=="],
+
+ "ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="],
+
+ "argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="],
+
+ "asn1": ["asn1@0.2.6", "", { "dependencies": { "safer-buffer": "~2.1.0" } }, "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ=="],
+
+ "assert-plus": ["assert-plus@1.0.0", "", {}, "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="],
+
+ "async": ["async@2.6.4", "", { "dependencies": { "lodash": "^4.17.14" } }, "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA=="],
+
+ "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="],
+
+ "aws-sign2": ["aws-sign2@0.7.0", "", {}, "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA=="],
+
+ "aws4": ["aws4@1.13.2", "", {}, "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw=="],
+
+ "babel-code-frame": ["babel-code-frame@6.26.0", "", { "dependencies": { "chalk": "^1.1.3", "esutils": "^2.0.2", "js-tokens": "^3.0.2" } }, "sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g=="],
+
+ "babel-core": ["babel-core@6.26.3", "", { "dependencies": { "babel-code-frame": "^6.26.0", "babel-generator": "^6.26.0", "babel-helpers": "^6.24.1", "babel-messages": "^6.23.0", "babel-register": "^6.26.0", "babel-runtime": "^6.26.0", "babel-template": "^6.26.0", "babel-traverse": "^6.26.0", "babel-types": "^6.26.0", "babylon": "^6.18.0", "convert-source-map": "^1.5.1", "debug": "^2.6.9", "json5": "^0.5.1", "lodash": "^4.17.4", "minimatch": "^3.0.4", "path-is-absolute": "^1.0.1", "private": "^0.1.8", "slash": "^1.0.0", "source-map": "^0.5.7" } }, "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA=="],
+
+ "babel-generator": ["babel-generator@6.26.1", "", { "dependencies": { "babel-messages": "^6.23.0", "babel-runtime": "^6.26.0", "babel-types": "^6.26.0", "detect-indent": "^4.0.0", "jsesc": "^1.3.0", "lodash": "^4.17.4", "source-map": "^0.5.7", "trim-right": "^1.0.1" } }, "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA=="],
+
+ "babel-helper-builder-binary-assignment-operator-visitor": ["babel-helper-builder-binary-assignment-operator-visitor@6.24.1", "", { "dependencies": { "babel-helper-explode-assignable-expression": "^6.24.1", "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" } }, "sha512-gCtfYORSG1fUMX4kKraymq607FWgMWg+j42IFPc18kFQEsmtaibP4UrqsXt8FlEJle25HUd4tsoDR7H2wDhe9Q=="],
+
+ "babel-helper-builder-react-jsx": ["babel-helper-builder-react-jsx@6.26.0", "", { "dependencies": { "babel-runtime": "^6.26.0", "babel-types": "^6.26.0", "esutils": "^2.0.2" } }, "sha512-02I9jDjnVEuGy2BR3LRm9nPRb/+Ja0pvZVLr1eI5TYAA/dB0Xoc+WBo50+aDfhGDLhlBY1+QURjn9uvcFd8gzg=="],
+
+ "babel-helper-call-delegate": ["babel-helper-call-delegate@6.24.1", "", { "dependencies": { "babel-helper-hoist-variables": "^6.24.1", "babel-runtime": "^6.22.0", "babel-traverse": "^6.24.1", "babel-types": "^6.24.1" } }, "sha512-RL8n2NiEj+kKztlrVJM9JT1cXzzAdvWFh76xh/H1I4nKwunzE4INBXn8ieCZ+wh4zWszZk7NBS1s/8HR5jDkzQ=="],
+
+ "babel-helper-define-map": ["babel-helper-define-map@6.26.0", "", { "dependencies": { "babel-helper-function-name": "^6.24.1", "babel-runtime": "^6.26.0", "babel-types": "^6.26.0", "lodash": "^4.17.4" } }, "sha512-bHkmjcC9lM1kmZcVpA5t2om2nzT/xiZpo6TJq7UlZ3wqKfzia4veeXbIhKvJXAMzhhEBd3cR1IElL5AenWEUpA=="],
+
+ "babel-helper-explode-assignable-expression": ["babel-helper-explode-assignable-expression@6.24.1", "", { "dependencies": { "babel-runtime": "^6.22.0", "babel-traverse": "^6.24.1", "babel-types": "^6.24.1" } }, "sha512-qe5csbhbvq6ccry9G7tkXbzNtcDiH4r51rrPUbwwoTzZ18AqxWYRZT6AOmxrpxKnQBW0pYlBI/8vh73Z//78nQ=="],
+
+ "babel-helper-function-name": ["babel-helper-function-name@6.24.1", "", { "dependencies": { "babel-helper-get-function-arity": "^6.24.1", "babel-runtime": "^6.22.0", "babel-template": "^6.24.1", "babel-traverse": "^6.24.1", "babel-types": "^6.24.1" } }, "sha512-Oo6+e2iX+o9eVvJ9Y5eKL5iryeRdsIkwRYheCuhYdVHsdEQysbc2z2QkqCLIYnNxkT5Ss3ggrHdXiDI7Dhrn4Q=="],
+
+ "babel-helper-get-function-arity": ["babel-helper-get-function-arity@6.24.1", "", { "dependencies": { "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" } }, "sha512-WfgKFX6swFB1jS2vo+DwivRN4NB8XUdM3ij0Y1gnC21y1tdBoe6xjVnd7NSI6alv+gZXCtJqvrTeMW3fR/c0ng=="],
+
+ "babel-helper-hoist-variables": ["babel-helper-hoist-variables@6.24.1", "", { "dependencies": { "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" } }, "sha512-zAYl3tqerLItvG5cKYw7f1SpvIxS9zi7ohyGHaI9cgDUjAT6YcY9jIEH5CstetP5wHIVSceXwNS7Z5BpJg+rOw=="],
+
+ "babel-helper-optimise-call-expression": ["babel-helper-optimise-call-expression@6.24.1", "", { "dependencies": { "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" } }, "sha512-Op9IhEaxhbRT8MDXx2iNuMgciu2V8lDvYCNQbDGjdBNCjaMvyLf4wl4A3b8IgndCyQF8TwfgsQ8T3VD8aX1/pA=="],
+
+ "babel-helper-regex": ["babel-helper-regex@6.26.0", "", { "dependencies": { "babel-runtime": "^6.26.0", "babel-types": "^6.26.0", "lodash": "^4.17.4" } }, "sha512-VlPiWmqmGJp0x0oK27Out1D+71nVVCTSdlbhIVoaBAj2lUgrNjBCRR9+llO4lTSb2O4r7PJg+RobRkhBrf6ofg=="],
+
+ "babel-helper-remap-async-to-generator": ["babel-helper-remap-async-to-generator@6.24.1", "", { "dependencies": { "babel-helper-function-name": "^6.24.1", "babel-runtime": "^6.22.0", "babel-template": "^6.24.1", "babel-traverse": "^6.24.1", "babel-types": "^6.24.1" } }, "sha512-RYqaPD0mQyQIFRu7Ho5wE2yvA/5jxqCIj/Lv4BXNq23mHYu/vxikOy2JueLiBxQknwapwrJeNCesvY0ZcfnlHg=="],
+
+ "babel-helper-replace-supers": ["babel-helper-replace-supers@6.24.1", "", { "dependencies": { "babel-helper-optimise-call-expression": "^6.24.1", "babel-messages": "^6.23.0", "babel-runtime": "^6.22.0", "babel-template": "^6.24.1", "babel-traverse": "^6.24.1", "babel-types": "^6.24.1" } }, "sha512-sLI+u7sXJh6+ToqDr57Bv973kCepItDhMou0xCP2YPVmR1jkHSCY+p1no8xErbV1Siz5QE8qKT1WIwybSWlqjw=="],
+
+ "babel-helpers": ["babel-helpers@6.24.1", "", { "dependencies": { "babel-runtime": "^6.22.0", "babel-template": "^6.24.1" } }, "sha512-n7pFrqQm44TCYvrCDb0MqabAF+JUBq+ijBvNMUxpkLjJaAu32faIexewMumrH5KLLJ1HDyT0PTEqRyAe/GwwuQ=="],
+
+ "babel-loader": ["babel-loader@10.0.0", "", { "dependencies": { "find-up": "^5.0.0" }, "peerDependencies": { "@babel/core": "^7.12.0", "webpack": ">=5.61.0" } }, "sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA=="],
+
+ "babel-messages": ["babel-messages@6.23.0", "", { "dependencies": { "babel-runtime": "^6.22.0" } }, "sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w=="],
+
+ "babel-plugin-check-es2015-constants": ["babel-plugin-check-es2015-constants@6.22.0", "", { "dependencies": { "babel-runtime": "^6.22.0" } }, "sha512-B1M5KBP29248dViEo1owyY32lk1ZSH2DaNNrXLGt8lyjjHm7pBqAdQ7VKUPR6EEDO323+OvT3MQXbCin8ooWdA=="],
+
+ "babel-plugin-polyfill-corejs2": ["babel-plugin-polyfill-corejs2@0.4.14", "", { "dependencies": { "@babel/compat-data": "^7.27.7", "@babel/helper-define-polyfill-provider": "^0.6.5", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg=="],
+
+ "babel-plugin-polyfill-corejs3": ["babel-plugin-polyfill-corejs3@0.13.0", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.5", "core-js-compat": "^3.43.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A=="],
+
+ "babel-plugin-polyfill-regenerator": ["babel-plugin-polyfill-regenerator@0.6.5", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.5" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg=="],
+
+ "babel-plugin-syntax-async-functions": ["babel-plugin-syntax-async-functions@6.13.0", "", {}, "sha512-4Zp4unmHgw30A1eWI5EpACji2qMocisdXhAftfhXoSV9j0Tvj6nRFE3tOmRY912E0FMRm/L5xWE7MGVT2FoLnw=="],
+
+ "babel-plugin-syntax-exponentiation-operator": ["babel-plugin-syntax-exponentiation-operator@6.13.0", "", {}, "sha512-Z/flU+T9ta0aIEKl1tGEmN/pZiI1uXmCiGFRegKacQfEJzp7iNsKloZmyJlQr+75FCJtiFfGIK03SiCvCt9cPQ=="],
+
+ "babel-plugin-syntax-jsx": ["babel-plugin-syntax-jsx@6.18.0", "", {}, "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw=="],
+
+ "babel-plugin-syntax-trailing-function-commas": ["babel-plugin-syntax-trailing-function-commas@6.22.0", "", {}, "sha512-Gx9CH3Q/3GKbhs07Bszw5fPTlU+ygrOGfAhEt7W2JICwufpC4SuO0mG0+4NykPBSYPMJhqvVlDBU17qB1D+hMQ=="],
+
+ "babel-plugin-transform-async-to-generator": ["babel-plugin-transform-async-to-generator@6.24.1", "", { "dependencies": { "babel-helper-remap-async-to-generator": "^6.24.1", "babel-plugin-syntax-async-functions": "^6.8.0", "babel-runtime": "^6.22.0" } }, "sha512-7BgYJujNCg0Ti3x0c/DL3tStvnKS6ktIYOmo9wginv/dfZOrbSZ+qG4IRRHMBOzZ5Awb1skTiAsQXg/+IWkZYw=="],
+
+ "babel-plugin-transform-es2015-arrow-functions": ["babel-plugin-transform-es2015-arrow-functions@6.22.0", "", { "dependencies": { "babel-runtime": "^6.22.0" } }, "sha512-PCqwwzODXW7JMrzu+yZIaYbPQSKjDTAsNNlK2l5Gg9g4rz2VzLnZsStvp/3c46GfXpwkyufb3NCyG9+50FF1Vg=="],
+
+ "babel-plugin-transform-es2015-block-scoped-functions": ["babel-plugin-transform-es2015-block-scoped-functions@6.22.0", "", { "dependencies": { "babel-runtime": "^6.22.0" } }, "sha512-2+ujAT2UMBzYFm7tidUsYh+ZoIutxJ3pN9IYrF1/H6dCKtECfhmB8UkHVpyxDwkj0CYbQG35ykoz925TUnBc3A=="],
+
+ "babel-plugin-transform-es2015-block-scoping": ["babel-plugin-transform-es2015-block-scoping@6.26.0", "", { "dependencies": { "babel-runtime": "^6.26.0", "babel-template": "^6.26.0", "babel-traverse": "^6.26.0", "babel-types": "^6.26.0", "lodash": "^4.17.4" } }, "sha512-YiN6sFAQ5lML8JjCmr7uerS5Yc/EMbgg9G8ZNmk2E3nYX4ckHR01wrkeeMijEf5WHNK5TW0Sl0Uu3pv3EdOJWw=="],
+
+ "babel-plugin-transform-es2015-classes": ["babel-plugin-transform-es2015-classes@6.24.1", "", { "dependencies": { "babel-helper-define-map": "^6.24.1", "babel-helper-function-name": "^6.24.1", "babel-helper-optimise-call-expression": "^6.24.1", "babel-helper-replace-supers": "^6.24.1", "babel-messages": "^6.23.0", "babel-runtime": "^6.22.0", "babel-template": "^6.24.1", "babel-traverse": "^6.24.1", "babel-types": "^6.24.1" } }, "sha512-5Dy7ZbRinGrNtmWpquZKZ3EGY8sDgIVB4CU8Om8q8tnMLrD/m94cKglVcHps0BCTdZ0TJeeAWOq2TK9MIY6cag=="],
+
+ "babel-plugin-transform-es2015-computed-properties": ["babel-plugin-transform-es2015-computed-properties@6.24.1", "", { "dependencies": { "babel-runtime": "^6.22.0", "babel-template": "^6.24.1" } }, "sha512-C/uAv4ktFP/Hmh01gMTvYvICrKze0XVX9f2PdIXuriCSvUmV9j+u+BB9f5fJK3+878yMK6dkdcq+Ymr9mrcLzw=="],
+
+ "babel-plugin-transform-es2015-destructuring": ["babel-plugin-transform-es2015-destructuring@6.23.0", "", { "dependencies": { "babel-runtime": "^6.22.0" } }, "sha512-aNv/GDAW0j/f4Uy1OEPZn1mqD+Nfy9viFGBfQ5bZyT35YqOiqx7/tXdyfZkJ1sC21NyEsBdfDY6PYmLHF4r5iA=="],
+
+ "babel-plugin-transform-es2015-duplicate-keys": ["babel-plugin-transform-es2015-duplicate-keys@6.24.1", "", { "dependencies": { "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" } }, "sha512-ossocTuPOssfxO2h+Z3/Ea1Vo1wWx31Uqy9vIiJusOP4TbF7tPs9U0sJ9pX9OJPf4lXRGj5+6Gkl/HHKiAP5ug=="],
+
+ "babel-plugin-transform-es2015-for-of": ["babel-plugin-transform-es2015-for-of@6.23.0", "", { "dependencies": { "babel-runtime": "^6.22.0" } }, "sha512-DLuRwoygCoXx+YfxHLkVx5/NpeSbVwfoTeBykpJK7JhYWlL/O8hgAK/reforUnZDlxasOrVPPJVI/guE3dCwkw=="],
+
+ "babel-plugin-transform-es2015-function-name": ["babel-plugin-transform-es2015-function-name@6.24.1", "", { "dependencies": { "babel-helper-function-name": "^6.24.1", "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" } }, "sha512-iFp5KIcorf11iBqu/y/a7DK3MN5di3pNCzto61FqCNnUX4qeBwcV1SLqe10oXNnCaxBUImX3SckX2/o1nsrTcg=="],
+
+ "babel-plugin-transform-es2015-literals": ["babel-plugin-transform-es2015-literals@6.22.0", "", { "dependencies": { "babel-runtime": "^6.22.0" } }, "sha512-tjFl0cwMPpDYyoqYA9li1/7mGFit39XiNX5DKC/uCNjBctMxyL1/PT/l4rSlbvBG1pOKI88STRdUsWXB3/Q9hQ=="],
+
+ "babel-plugin-transform-es2015-modules-amd": ["babel-plugin-transform-es2015-modules-amd@6.24.1", "", { "dependencies": { "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", "babel-runtime": "^6.22.0", "babel-template": "^6.24.1" } }, "sha512-LnIIdGWIKdw7zwckqx+eGjcS8/cl8D74A3BpJbGjKTFFNJSMrjN4bIh22HY1AlkUbeLG6X6OZj56BDvWD+OeFA=="],
+
+ "babel-plugin-transform-es2015-modules-commonjs": ["babel-plugin-transform-es2015-modules-commonjs@6.26.2", "", { "dependencies": { "babel-plugin-transform-strict-mode": "^6.24.1", "babel-runtime": "^6.26.0", "babel-template": "^6.26.0", "babel-types": "^6.26.0" } }, "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q=="],
+
+ "babel-plugin-transform-es2015-modules-systemjs": ["babel-plugin-transform-es2015-modules-systemjs@6.24.1", "", { "dependencies": { "babel-helper-hoist-variables": "^6.24.1", "babel-runtime": "^6.22.0", "babel-template": "^6.24.1" } }, "sha512-ONFIPsq8y4bls5PPsAWYXH/21Hqv64TBxdje0FvU3MhIV6QM2j5YS7KvAzg/nTIVLot2D2fmFQrFWCbgHlFEjg=="],
+
+ "babel-plugin-transform-es2015-modules-umd": ["babel-plugin-transform-es2015-modules-umd@6.24.1", "", { "dependencies": { "babel-plugin-transform-es2015-modules-amd": "^6.24.1", "babel-runtime": "^6.22.0", "babel-template": "^6.24.1" } }, "sha512-LpVbiT9CLsuAIp3IG0tfbVo81QIhn6pE8xBJ7XSeCtFlMltuar5VuBV6y6Q45tpui9QWcy5i0vLQfCfrnF7Kiw=="],
+
+ "babel-plugin-transform-es2015-object-super": ["babel-plugin-transform-es2015-object-super@6.24.1", "", { "dependencies": { "babel-helper-replace-supers": "^6.24.1", "babel-runtime": "^6.22.0" } }, "sha512-8G5hpZMecb53vpD3mjs64NhI1au24TAmokQ4B+TBFBjN9cVoGoOvotdrMMRmHvVZUEvqGUPWL514woru1ChZMA=="],
+
+ "babel-plugin-transform-es2015-parameters": ["babel-plugin-transform-es2015-parameters@6.24.1", "", { "dependencies": { "babel-helper-call-delegate": "^6.24.1", "babel-helper-get-function-arity": "^6.24.1", "babel-runtime": "^6.22.0", "babel-template": "^6.24.1", "babel-traverse": "^6.24.1", "babel-types": "^6.24.1" } }, "sha512-8HxlW+BB5HqniD+nLkQ4xSAVq3bR/pcYW9IigY+2y0dI+Y7INFeTbfAQr+63T3E4UDsZGjyb+l9txUnABWxlOQ=="],
+
+ "babel-plugin-transform-es2015-shorthand-properties": ["babel-plugin-transform-es2015-shorthand-properties@6.24.1", "", { "dependencies": { "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" } }, "sha512-mDdocSfUVm1/7Jw/FIRNw9vPrBQNePy6wZJlR8HAUBLybNp1w/6lr6zZ2pjMShee65t/ybR5pT8ulkLzD1xwiw=="],
+
+ "babel-plugin-transform-es2015-spread": ["babel-plugin-transform-es2015-spread@6.22.0", "", { "dependencies": { "babel-runtime": "^6.22.0" } }, "sha512-3Ghhi26r4l3d0Js933E5+IhHwk0A1yiutj9gwvzmFbVV0sPMYk2lekhOufHBswX7NCoSeF4Xrl3sCIuSIa+zOg=="],
+
+ "babel-plugin-transform-es2015-sticky-regex": ["babel-plugin-transform-es2015-sticky-regex@6.24.1", "", { "dependencies": { "babel-helper-regex": "^6.24.1", "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" } }, "sha512-CYP359ADryTo3pCsH0oxRo/0yn6UsEZLqYohHmvLQdfS9xkf+MbCzE3/Kolw9OYIY4ZMilH25z/5CbQbwDD+lQ=="],
+
+ "babel-plugin-transform-es2015-template-literals": ["babel-plugin-transform-es2015-template-literals@6.22.0", "", { "dependencies": { "babel-runtime": "^6.22.0" } }, "sha512-x8b9W0ngnKzDMHimVtTfn5ryimars1ByTqsfBDwAqLibmuuQY6pgBQi5z1ErIsUOWBdw1bW9FSz5RZUojM4apg=="],
+
+ "babel-plugin-transform-es2015-typeof-symbol": ["babel-plugin-transform-es2015-typeof-symbol@6.23.0", "", { "dependencies": { "babel-runtime": "^6.22.0" } }, "sha512-fz6J2Sf4gYN6gWgRZaoFXmq93X+Li/8vf+fb0sGDVtdeWvxC9y5/bTD7bvfWMEq6zetGEHpWjtzRGSugt5kNqw=="],
+
+ "babel-plugin-transform-es2015-unicode-regex": ["babel-plugin-transform-es2015-unicode-regex@6.24.1", "", { "dependencies": { "babel-helper-regex": "^6.24.1", "babel-runtime": "^6.22.0", "regexpu-core": "^2.0.0" } }, "sha512-v61Dbbihf5XxnYjtBN04B/JBvsScY37R1cZT5r9permN1cp+b70DY3Ib3fIkgn1DI9U3tGgBJZVD8p/mE/4JbQ=="],
+
+ "babel-plugin-transform-exponentiation-operator": ["babel-plugin-transform-exponentiation-operator@6.24.1", "", { "dependencies": { "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", "babel-plugin-syntax-exponentiation-operator": "^6.8.0", "babel-runtime": "^6.22.0" } }, "sha512-LzXDmbMkklvNhprr20//RStKVcT8Cu+SQtX18eMHLhjHf2yFzwtQ0S2f0jQ+89rokoNdmwoSqYzAhq86FxlLSQ=="],
+
+ "babel-plugin-transform-react-jsx": ["babel-plugin-transform-react-jsx@6.24.1", "", { "dependencies": { "babel-helper-builder-react-jsx": "^6.24.1", "babel-plugin-syntax-jsx": "^6.8.0", "babel-runtime": "^6.22.0" } }, "sha512-s+q/Y2u2OgDPHRuod3t6zyLoV8pUHc64i/O7ZNgIOEdYTq+ChPeybcKBi/xk9VI60VriILzFPW+dUxAEbTxh2w=="],
+
+ "babel-plugin-transform-regenerator": ["babel-plugin-transform-regenerator@6.26.0", "", { "dependencies": { "regenerator-transform": "^0.10.0" } }, "sha512-LS+dBkUGlNR15/5WHKe/8Neawx663qttS6AGqoOUhICc9d1KciBvtrQSuc0PI+CxQ2Q/S1aKuJ+u64GtLdcEZg=="],
+
+ "babel-plugin-transform-strict-mode": ["babel-plugin-transform-strict-mode@6.24.1", "", { "dependencies": { "babel-runtime": "^6.22.0", "babel-types": "^6.24.1" } }, "sha512-j3KtSpjyLSJxNoCDrhwiJad8kw0gJ9REGj8/CqL0HeRyLnvUNYV9zcqluL6QJSXh3nfsLEmSLvwRfGzrgR96Pw=="],
+
+ "babel-preset-env": ["babel-preset-env@1.7.0", "", { "dependencies": { "babel-plugin-check-es2015-constants": "^6.22.0", "babel-plugin-syntax-trailing-function-commas": "^6.22.0", "babel-plugin-transform-async-to-generator": "^6.22.0", "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", "babel-plugin-transform-es2015-block-scoping": "^6.23.0", "babel-plugin-transform-es2015-classes": "^6.23.0", "babel-plugin-transform-es2015-computed-properties": "^6.22.0", "babel-plugin-transform-es2015-destructuring": "^6.23.0", "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", "babel-plugin-transform-es2015-for-of": "^6.23.0", "babel-plugin-transform-es2015-function-name": "^6.22.0", "babel-plugin-transform-es2015-literals": "^6.22.0", "babel-plugin-transform-es2015-modules-amd": "^6.22.0", "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", "babel-plugin-transform-es2015-modules-umd": "^6.23.0", "babel-plugin-transform-es2015-object-super": "^6.22.0", "babel-plugin-transform-es2015-parameters": "^6.23.0", "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", "babel-plugin-transform-es2015-spread": "^6.22.0", "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", "babel-plugin-transform-es2015-template-literals": "^6.22.0", "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", "babel-plugin-transform-exponentiation-operator": "^6.22.0", "babel-plugin-transform-regenerator": "^6.22.0", "browserslist": "^3.2.6", "invariant": "^2.2.2", "semver": "^5.3.0" } }, "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg=="],
+
+ "babel-register": ["babel-register@6.26.0", "", { "dependencies": { "babel-core": "^6.26.0", "babel-runtime": "^6.26.0", "core-js": "^2.5.0", "home-or-tmp": "^2.0.0", "lodash": "^4.17.4", "mkdirp": "^0.5.1", "source-map-support": "^0.4.15" } }, "sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A=="],
+
+ "babel-runtime": ["babel-runtime@6.26.0", "", { "dependencies": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" } }, "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g=="],
+
+ "babel-template": ["babel-template@6.26.0", "", { "dependencies": { "babel-runtime": "^6.26.0", "babel-traverse": "^6.26.0", "babel-types": "^6.26.0", "babylon": "^6.18.0", "lodash": "^4.17.4" } }, "sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg=="],
+
+ "babel-traverse": ["babel-traverse@6.26.0", "", { "dependencies": { "babel-code-frame": "^6.26.0", "babel-messages": "^6.23.0", "babel-runtime": "^6.26.0", "babel-types": "^6.26.0", "babylon": "^6.18.0", "debug": "^2.6.8", "globals": "^9.18.0", "invariant": "^2.2.2", "lodash": "^4.17.4" } }, "sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA=="],
+
+ "babel-types": ["babel-types@6.26.0", "", { "dependencies": { "babel-runtime": "^6.26.0", "esutils": "^2.0.2", "lodash": "^4.17.4", "to-fast-properties": "^1.0.3" } }, "sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g=="],
+
+ "babylon": ["babylon@6.18.0", "", { "bin": { "babylon": "./bin/babylon.js" } }, "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="],
+
+ "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
+
+ "bcrypt-pbkdf": ["bcrypt-pbkdf@1.0.2", "", { "dependencies": { "tweetnacl": "^0.14.3" } }, "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w=="],
+
+ "big.js": ["big.js@5.2.2", "", {}, "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="],
+
+ "bluebird": ["bluebird@3.7.2", "", {}, "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="],
+
+ "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="],
+
+ "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="],
+
+ "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
+
+ "browserslist": ["browserslist@3.2.8", "", { "dependencies": { "caniuse-lite": "^1.0.30000844", "electron-to-chromium": "^1.3.47" }, "bin": { "browserslist": "./cli.js" } }, "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ=="],
+
+ "buffer-crc32": ["buffer-crc32@0.2.13", "", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="],
+
+ "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="],
+
+ "caller-path": ["caller-path@0.1.0", "", { "dependencies": { "callsites": "^0.2.0" } }, "sha512-UJiE1otjXPF5/x+T3zTnSFiTOEmJoGTD9HmBoxnCUwho61a2eSNn/VwtwuIBDAo2SEOv1AJ7ARI5gCmohFLu/g=="],
+
+ "callsites": ["callsites@0.2.0", "", {}, "sha512-Zv4Dns9IbXXmPkgRRUjAaJQgfN4xX5p6+RQFhWUqscdvvK2xK/ZL8b3IXIJsj+4sD+f24NwnWy2BY8AJ82JB0A=="],
+
+ "camelcase": ["camelcase@1.2.1", "", {}, "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g=="],
+
+ "caniuse-api": ["caniuse-api@3.0.0", "", { "dependencies": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", "lodash.memoize": "^4.1.2", "lodash.uniq": "^4.5.0" } }, "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw=="],
+
+ "caniuse-lite": ["caniuse-lite@1.0.30001727", "", {}, "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q=="],
+
+ "caseless": ["caseless@0.12.0", "", {}, "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="],
+
+ "center-align": ["center-align@0.1.3", "", { "dependencies": { "align-text": "^0.1.3", "lazy-cache": "^1.0.3" } }, "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ=="],
+
+ "chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="],
+
+ "chardet": ["chardet@0.4.2", "", {}, "sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg=="],
+
+ "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
+
+ "chrome-trace-event": ["chrome-trace-event@1.0.4", "", {}, "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ=="],
+
+ "ci-info": ["ci-info@1.6.0", "", {}, "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A=="],
+
+ "circular-json": ["circular-json@0.3.3", "", {}, "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A=="],
+
+ "cli-cursor": ["cli-cursor@2.1.0", "", { "dependencies": { "restore-cursor": "^2.0.0" } }, "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw=="],
+
+ "cli-width": ["cli-width@2.2.1", "", {}, "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw=="],
+
+ "cliui": ["cliui@2.1.0", "", { "dependencies": { "center-align": "^0.1.1", "right-align": "^0.1.1", "wordwrap": "0.0.2" } }, "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA=="],
+
+ "clone": ["clone@1.0.4", "", {}, "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg=="],
+
+ "clone-deep": ["clone-deep@4.0.1", "", { "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", "shallow-clone": "^3.0.0" } }, "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ=="],
+
+ "co": ["co@4.6.0", "", {}, "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ=="],
+
+ "code-point-at": ["code-point-at@1.1.0", "", {}, "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA=="],
+
+ "color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="],
+
+ "color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="],
+
+ "colord": ["colord@2.9.3", "", {}, "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw=="],
+
+ "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="],
+
+ "colors": ["colors@1.0.3", "", {}, "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw=="],
+
+ "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="],
+
+ "commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="],
+
+ "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
+
+ "concat-stream": ["concat-stream@1.6.2", "", { "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" } }, "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw=="],
+
+ "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="],
+
+ "core-js": ["core-js@2.6.12", "", {}, "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="],
+
+ "core-js-compat": ["core-js-compat@3.44.0", "", { "dependencies": { "browserslist": "^4.25.1" } }, "sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA=="],
+
+ "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="],
+
+ "corser": ["corser@2.0.1", "", {}, "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ=="],
+
+ "cross-spawn": ["cross-spawn@5.1.0", "", { "dependencies": { "lru-cache": "^4.0.1", "shebang-command": "^1.2.0", "which": "^1.2.9" } }, "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A=="],
+
+ "css-declaration-sorter": ["css-declaration-sorter@7.2.0", "", { "peerDependencies": { "postcss": "^8.0.9" } }, "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow=="],
+
+ "css-loader": ["css-loader@7.1.2", "", { "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.33", "postcss-modules-extract-imports": "^3.1.0", "postcss-modules-local-by-default": "^4.0.5", "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", "semver": "^7.5.4" }, "peerDependencies": { "@rspack/core": "0.x || 1.x", "webpack": "^5.27.0" }, "optionalPeers": ["@rspack/core", "webpack"] }, "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA=="],
+
+ "css-minimizer-webpack-plugin": ["css-minimizer-webpack-plugin@7.0.2", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "cssnano": "^7.0.4", "jest-worker": "^29.7.0", "postcss": "^8.4.40", "schema-utils": "^4.2.0", "serialize-javascript": "^6.0.2" }, "peerDependencies": { "webpack": "^5.0.0" } }, "sha512-nBRWZtI77PBZQgcXMNqiIXVshiQOVLGSf2qX/WZfG8IQfMbeHUMXaBWQmiiSTmPJUflQxHjZjzAmuyO7tpL2Jg=="],
+
+ "css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="],
+
+ "css-tree": ["css-tree@3.1.0", "", { "dependencies": { "mdn-data": "2.12.2", "source-map-js": "^1.0.1" } }, "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w=="],
+
+ "css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="],
+
+ "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="],
+
+ "cssnano": ["cssnano@7.1.0", "", { "dependencies": { "cssnano-preset-default": "^7.0.8", "lilconfig": "^3.1.3" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-Pu3rlKkd0ZtlCUzBrKL1Z4YmhKppjC1H9jo7u1o4qaKqyhvixFgu5qLyNIAOjSTg9DjVPtUqdROq2EfpVMEe+w=="],
+
+ "cssnano-preset-default": ["cssnano-preset-default@7.0.8", "", { "dependencies": { "browserslist": "^4.25.1", "css-declaration-sorter": "^7.2.0", "cssnano-utils": "^5.0.1", "postcss-calc": "^10.1.1", "postcss-colormin": "^7.0.4", "postcss-convert-values": "^7.0.6", "postcss-discard-comments": "^7.0.4", "postcss-discard-duplicates": "^7.0.2", "postcss-discard-empty": "^7.0.1", "postcss-discard-overridden": "^7.0.1", "postcss-merge-longhand": "^7.0.5", "postcss-merge-rules": "^7.0.6", "postcss-minify-font-values": "^7.0.1", "postcss-minify-gradients": "^7.0.1", "postcss-minify-params": "^7.0.4", "postcss-minify-selectors": "^7.0.5", "postcss-normalize-charset": "^7.0.1", "postcss-normalize-display-values": "^7.0.1", "postcss-normalize-positions": "^7.0.1", "postcss-normalize-repeat-style": "^7.0.1", "postcss-normalize-string": "^7.0.1", "postcss-normalize-timing-functions": "^7.0.1", "postcss-normalize-unicode": "^7.0.4", "postcss-normalize-url": "^7.0.1", "postcss-normalize-whitespace": "^7.0.1", "postcss-ordered-values": "^7.0.2", "postcss-reduce-initial": "^7.0.4", "postcss-reduce-transforms": "^7.0.1", "postcss-svgo": "^7.1.0", "postcss-unique-selectors": "^7.0.4" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-d+3R2qwrUV3g4LEMOjnndognKirBZISylDZAF/TPeCWVjEwlXS2e4eN4ICkoobRe7pD3H6lltinKVyS1AJhdjQ=="],
+
+ "cssnano-utils": ["cssnano-utils@5.0.1", "", { "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg=="],
+
+ "csso": ["csso@5.0.5", "", { "dependencies": { "css-tree": "~2.2.0" } }, "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ=="],
+
+ "dashdash": ["dashdash@1.14.1", "", { "dependencies": { "assert-plus": "^1.0.0" } }, "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g=="],
+
+ "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="],
+
+ "decamelize": ["decamelize@1.2.0", "", {}, "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA=="],
+
+ "deep-defaults": ["deep-defaults@1.0.5", "", { "dependencies": { "lodash": "^4.17.5" } }, "sha512-5ev/sNkiHTmeTqbDJEDgdQa/Ub0eOMQNix9l+dLLGbwOos7/in5HdvHXI014wqxsET4YeJG9Eq4qj0PJRL8rSw=="],
+
+ "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="],
+
+ "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="],
+
+ "defaults": ["defaults@1.0.4", "", { "dependencies": { "clone": "^1.0.2" } }, "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A=="],
+
+ "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="],
+
+ "detect-indent": ["detect-indent@4.0.0", "", { "dependencies": { "repeating": "^2.0.0" } }, "sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A=="],
+
+ "detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="],
+
+ "doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="],
+
+ "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="],
+
+ "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="],
+
+ "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="],
+
+ "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="],
+
+ "ecc-jsbn": ["ecc-jsbn@0.1.2", "", { "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw=="],
+
+ "ecstatic": ["ecstatic@2.2.2", "", { "dependencies": { "he": "^1.1.1", "mime": "^1.2.11", "minimist": "^1.1.0", "url-join": "^2.0.2" }, "bin": { "ecstatic": "./lib/ecstatic.js" } }, "sha512-F1g29y3I+abOS+M0AiK2O9R96AJ49Bc3kH696HtqnN+CL3YhpUnSzHNoUBQL03qDsN9Lr1XeKIxTqEH3BtiBgg=="],
+
+ "electron": ["electron@1.8.8", "", { "dependencies": { "@types/node": "^8.0.24", "electron-download": "^3.0.1", "extract-zip": "^1.0.3" }, "bin": { "electron": "cli.js" } }, "sha512-1f9zJehcTTGjrkb06o6ds+gsRq6SYhZJyxOk6zIWjRH8hVy03y/RzUDELzNas71f5vcvXmfGVvyjeEsadDI8tg=="],
+
+ "electron-download": ["electron-download@3.3.0", "", { "dependencies": { "debug": "^2.2.0", "fs-extra": "^0.30.0", "home-path": "^1.0.1", "minimist": "^1.2.0", "nugget": "^2.0.0", "path-exists": "^2.1.0", "rc": "^1.1.2", "semver": "^5.3.0", "sumchecker": "^1.2.0" }, "bin": { "electron-download": "build/cli.js" } }, "sha512-F/p1+fwr/UAMl6NXp2w6Ke5x5WReguHp6EDm/1tIIqUyXfOW7JezoMoAUNL0ZaKDDCbciydllMwq8qq/f9ks0w=="],
+
+ "electron-to-chromium": ["electron-to-chromium@1.5.188", "", {}, "sha512-pfEx5CBFAocOKNrc+i5fSvhDaI1Vr9R9aT5uX1IzM3hhdL6k649wfuUcdUd9EZnmbE1xdfA51CwqQ61CO3Xl3g=="],
+
+ "element-resize-event": ["element-resize-event@2.0.9", "", {}, "sha512-xiv2qfGeuMfXjxcAd0if4tR7xiqEH4dXkGFAfF7O4nC960JteYrJlbO00PWX1r9J2rxtqs0TdfXe/dH9J8kEZQ=="],
+
+ "emojis-list": ["emojis-list@3.0.0", "", {}, "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="],
+
+ "enhanced-resolve": ["enhanced-resolve@5.18.2", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ=="],
+
+ "enqueue": ["enqueue@1.0.2", "", { "dependencies": { "sliced": "0.0.5" } }, "sha512-6C3wjFsq5SqRLDAgOBYVouvjlFblsp//cdoIdUDt66jdHii7dp3yJCqiNDcFdRp4vKNXYug+XVTbhxfe5MCtCw=="],
+
+ "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
+
+ "envinfo": ["envinfo@7.14.0", "", { "bin": { "envinfo": "dist/cli.js" } }, "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg=="],
+
+ "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="],
+
+ "es6-promise": ["es6-promise@4.2.8", "", {}, "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w=="],
+
+ "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
+
+ "escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="],
+
+ "eslint": ["eslint@4.19.1", "", { "dependencies": { "ajv": "^5.3.0", "babel-code-frame": "^6.22.0", "chalk": "^2.1.0", "concat-stream": "^1.6.0", "cross-spawn": "^5.1.0", "debug": "^3.1.0", "doctrine": "^2.1.0", "eslint-scope": "^3.7.1", "eslint-visitor-keys": "^1.0.0", "espree": "^3.5.4", "esquery": "^1.0.0", "esutils": "^2.0.2", "file-entry-cache": "^2.0.0", "functional-red-black-tree": "^1.0.1", "glob": "^7.1.2", "globals": "^11.0.1", "ignore": "^3.3.3", "imurmurhash": "^0.1.4", "inquirer": "^3.0.6", "is-resolvable": "^1.0.0", "js-yaml": "^3.9.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", "lodash": "^4.17.4", "minimatch": "^3.0.2", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", "optionator": "^0.8.2", "path-is-inside": "^1.0.2", "pluralize": "^7.0.0", "progress": "^2.0.0", "regexpp": "^1.0.1", "require-uncached": "^1.0.3", "semver": "^5.3.0", "strip-ansi": "^4.0.0", "strip-json-comments": "~2.0.1", "table": "4.0.2", "text-table": "~0.2.0" }, "bin": { "eslint": "./bin/eslint.js" } }, "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ=="],
+
+ "eslint-scope": ["eslint-scope@3.7.3", "", { "dependencies": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" } }, "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA=="],
+
+ "eslint-visitor-keys": ["eslint-visitor-keys@1.3.0", "", {}, "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ=="],
+
+ "espree": ["espree@3.5.4", "", { "dependencies": { "acorn": "^5.5.0", "acorn-jsx": "^3.0.0" } }, "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A=="],
+
+ "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="],
+
+ "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="],
+
+ "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="],
+
+ "estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="],
+
+ "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
+
+ "eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="],
+
+ "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="],
+
+ "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="],
+
+ "external-editor": ["external-editor@2.2.0", "", { "dependencies": { "chardet": "^0.4.0", "iconv-lite": "^0.4.17", "tmp": "^0.0.33" } }, "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A=="],
+
+ "extract-text-webpack-plugin": ["extract-text-webpack-plugin@3.0.2", "", { "dependencies": { "async": "^2.4.1", "loader-utils": "^1.1.0", "schema-utils": "^0.3.0", "webpack-sources": "^1.0.1" }, "peerDependencies": { "webpack": "^3.1.0" } }, "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ=="],
+
+ "extract-zip": ["extract-zip@1.7.0", "", { "dependencies": { "concat-stream": "^1.6.2", "debug": "^2.6.9", "mkdirp": "^0.5.4", "yauzl": "^2.10.0" }, "bin": { "extract-zip": "cli.js" } }, "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA=="],
+
+ "extsprintf": ["extsprintf@1.3.0", "", {}, "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g=="],
+
+ "fast-deep-equal": ["fast-deep-equal@1.1.0", "", {}, "sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw=="],
+
+ "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="],
+
+ "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="],
+
+ "fast-uri": ["fast-uri@3.0.6", "", {}, "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw=="],
+
+ "fastest-levenshtein": ["fastest-levenshtein@1.0.16", "", {}, "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg=="],
+
+ "fd-slicer": ["fd-slicer@1.1.0", "", { "dependencies": { "pend": "~1.2.0" } }, "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g=="],
+
+ "figures": ["figures@2.0.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA=="],
+
+ "file-entry-cache": ["file-entry-cache@2.0.0", "", { "dependencies": { "flat-cache": "^1.2.1", "object-assign": "^4.0.1" } }, "sha512-uXP/zGzxxFvFfcZGgBIwotm+Tdc55ddPAzF7iHshP4YGaXMww7rSF9peD9D1sui5ebONg5UobsZv+FfgEpGv/w=="],
+
+ "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
+
+ "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="],
+
+ "flat": ["flat@5.0.2", "", { "bin": { "flat": "cli.js" } }, "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ=="],
+
+ "flat-cache": ["flat-cache@1.3.4", "", { "dependencies": { "circular-json": "^0.3.1", "graceful-fs": "^4.1.2", "rimraf": "~2.6.2", "write": "^0.2.1" } }, "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg=="],
+
+ "follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="],
+
+ "forever-agent": ["forever-agent@0.6.1", "", {}, "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw=="],
+
+ "form-data": ["form-data@2.3.3", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ=="],
+
+ "fs-extra": ["fs-extra@0.30.0", "", { "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^2.1.0", "klaw": "^1.0.0", "path-is-absolute": "^1.0.0", "rimraf": "^2.2.8" } }, "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA=="],
+
+ "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="],
+
+ "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
+
+ "function-source": ["function-source@0.1.0", "", {}, "sha512-I80Bh3QAcLduCjhgkfrBnm67XwvjPSmiG3joj8GlTD8Qj4E4zkyDNjJXepbxCaCIsPJ3rwouWxAOaZfdDz5hEA=="],
+
+ "functional-red-black-tree": ["functional-red-black-tree@1.0.1", "", {}, "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g=="],
+
+ "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="],
+
+ "getpass": ["getpass@0.1.7", "", { "dependencies": { "assert-plus": "^1.0.0" } }, "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng=="],
+
+ "glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="],
+
+ "glob-to-regexp": ["glob-to-regexp@0.4.1", "", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="],
+
+ "globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="],
+
+ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
+
+ "har-schema": ["har-schema@2.0.0", "", {}, "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q=="],
+
+ "har-validator": ["har-validator@5.1.5", "", { "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" } }, "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w=="],
+
+ "has-ansi": ["has-ansi@2.0.0", "", { "dependencies": { "ansi-regex": "^2.0.0" } }, "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg=="],
+
+ "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
+
+ "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
+
+ "he": ["he@1.2.0", "", { "bin": { "he": "bin/he" } }, "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="],
+
+ "home-or-tmp": ["home-or-tmp@2.0.0", "", { "dependencies": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.1" } }, "sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg=="],
+
+ "home-path": ["home-path@1.0.7", "", {}, "sha512-tM1pVa+u3ZqQwIkXcWfhUlY3HWS3TsnKsfi2OHHvnhkX52s9etyktPyy1rQotkr0euWimChDq+QkQuDe8ngUlQ=="],
+
+ "http-proxy": ["http-proxy@1.18.1", "", { "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" } }, "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ=="],
+
+ "http-server": ["http-server@0.10.0", "", { "dependencies": { "colors": "1.0.3", "corser": "~2.0.0", "ecstatic": "^2.0.0", "http-proxy": "^1.8.1", "opener": "~1.4.0", "optimist": "0.6.x", "portfinder": "^1.0.13", "union": "~0.4.3" }, "bin": { "hs": "./bin/http-server", "http-server": "./bin/http-server" } }, "sha512-RmgukQzcSxenuuvIaNBfGOZjKsNnRpXT2JqGdX9pf7D4P6MfXXS59nameKIR4ZEEnNb0l2ys9rcxxYDkYm3Quw=="],
+
+ "http-signature": ["http-signature@1.2.0", "", { "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" } }, "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ=="],
+
+ "husky": ["husky@0.14.3", "", { "dependencies": { "is-ci": "^1.0.10", "normalize-path": "^1.0.0", "strip-indent": "^2.0.0" } }, "sha512-e21wivqHpstpoiWA/Yi8eFti8E+sQDSS53cpJsPptPs295QTOQR0ZwnHo2TXy1XOpZFD9rPOd3NpmqTK6uMLJA=="],
+
+ "iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="],
+
+ "icss-utils": ["icss-utils@5.1.0", "", { "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA=="],
+
+ "ignore": ["ignore@3.3.10", "", {}, "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug=="],
+
+ "immutable": ["immutable@5.1.3", "", {}, "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg=="],
+
+ "import-local": ["import-local@3.2.0", "", { "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" }, "bin": { "import-local-fixture": "fixtures/cli.js" } }, "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA=="],
+
+ "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],
+
+ "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="],
+
+ "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
+
+ "ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="],
+
+ "inquirer": ["inquirer@3.3.0", "", { "dependencies": { "ansi-escapes": "^3.0.0", "chalk": "^2.0.0", "cli-cursor": "^2.1.0", "cli-width": "^2.0.0", "external-editor": "^2.0.4", "figures": "^2.0.0", "lodash": "^4.3.0", "mute-stream": "0.0.7", "run-async": "^2.2.0", "rx-lite": "^4.0.8", "rx-lite-aggregates": "^4.0.8", "string-width": "^2.1.0", "strip-ansi": "^4.0.0", "through": "^2.3.6" } }, "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ=="],
+
+ "interpret": ["interpret@3.1.1", "", {}, "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ=="],
+
+ "invariant": ["invariant@2.2.4", "", { "dependencies": { "loose-envify": "^1.0.0" } }, "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA=="],
+
+ "is-buffer": ["is-buffer@1.1.6", "", {}, "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="],
+
+ "is-ci": ["is-ci@1.2.1", "", { "dependencies": { "ci-info": "^1.5.0" }, "bin": { "is-ci": "bin.js" } }, "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg=="],
+
+ "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="],
+
+ "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
+
+ "is-finite": ["is-finite@1.1.0", "", {}, "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w=="],
+
+ "is-fullwidth-code-point": ["is-fullwidth-code-point@2.0.0", "", {}, "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w=="],
+
+ "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
+
+ "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
+
+ "is-plain-object": ["is-plain-object@2.0.4", "", { "dependencies": { "isobject": "^3.0.1" } }, "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og=="],
+
+ "is-resolvable": ["is-resolvable@1.1.0", "", {}, "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg=="],
+
+ "is-typedarray": ["is-typedarray@1.0.0", "", {}, "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="],
+
+ "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="],
+
+ "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
+
+ "isobject": ["isobject@3.0.1", "", {}, "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg=="],
+
+ "isstream": ["isstream@0.1.2", "", {}, "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="],
+
+ "jest-util": ["jest-util@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA=="],
+
+ "jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="],
+
+ "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
+
+ "js-yaml": ["js-yaml@3.14.1", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g=="],
+
+ "jsbn": ["jsbn@0.1.1", "", {}, "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="],
+
+ "jsesc": ["jsesc@0.5.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA=="],
+
+ "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="],
+
+ "json-schema": ["json-schema@0.4.0", "", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="],
+
+ "json-schema-traverse": ["json-schema-traverse@0.3.1", "", {}, "sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA=="],
+
+ "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="],
+
+ "json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="],
+
+ "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
+
+ "jsonfile": ["jsonfile@2.4.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw=="],
+
+ "jsprim": ["jsprim@1.4.2", "", { "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", "json-schema": "0.4.0", "verror": "1.10.0" } }, "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw=="],
+
+ "keypress": ["keypress@0.1.0", "", {}, "sha512-x0yf9PL/nx9Nw9oLL8ZVErFAk85/lslwEP7Vz7s5SI1ODXZIgit3C5qyWjw4DxOuO/3Hb4866SQh28a1V1d+WA=="],
+
+ "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="],
+
+ "klaw": ["klaw@1.3.1", "", { "optionalDependencies": { "graceful-fs": "^4.1.9" } }, "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw=="],
+
+ "lazy-cache": ["lazy-cache@1.0.4", "", {}, "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ=="],
+
+ "levn": ["levn@0.3.0", "", { "dependencies": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" } }, "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA=="],
+
+ "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="],
+
+ "loader-runner": ["loader-runner@4.3.0", "", {}, "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg=="],
+
+ "loader-utils": ["loader-utils@1.4.2", "", { "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", "json5": "^1.0.1" } }, "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg=="],
+
+ "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="],
+
+ "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="],
+
+ "lodash.debounce": ["lodash.debounce@4.0.8", "", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="],
+
+ "lodash.memoize": ["lodash.memoize@4.1.2", "", {}, "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag=="],
+
+ "lodash.uniq": ["lodash.uniq@4.5.0", "", {}, "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ=="],
+
+ "longest": ["longest@1.0.1", "", {}, "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg=="],
+
+ "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="],
+
+ "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
+
+ "mdn-data": ["mdn-data@2.12.2", "", {}, "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA=="],
+
+ "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="],
+
+ "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
+
+ "mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="],
+
+ "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
+
+ "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
+
+ "mimic-fn": ["mimic-fn@1.2.0", "", {}, "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="],
+
+ "mini-css-extract-plugin": ["mini-css-extract-plugin@2.9.2", "", { "dependencies": { "schema-utils": "^4.0.0", "tapable": "^2.2.1" }, "peerDependencies": { "webpack": "^5.0.0" } }, "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w=="],
+
+ "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
+
+ "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="],
+
+ "minstache": ["minstache@1.2.0", "", { "dependencies": { "commander": "1.0.4" }, "bin": { "minstache": "bin/minstache" } }, "sha512-VSAeaiKXHIKifdNHCalWmFvChtLrNirwhDZd0yeEO57WXCT+uJYN3RPAusvLi3z7VlwFBBtDX80bG7aHkcMAmg=="],
+
+ "mkdirp": ["mkdirp@0.5.6", "", { "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="],
+
+ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
+
+ "mute-stream": ["mute-stream@0.0.7", "", {}, "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ=="],
+
+ "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
+
+ "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="],
+
+ "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="],
+
+ "nightmare": ["nightmare@2.10.0", "", { "dependencies": { "debug": "^2.2.0", "deep-defaults": "^1.0.3", "defaults": "^1.0.2", "electron": "^1.4.4", "enqueue": "^1.0.2", "function-source": "^0.1.0", "jsesc": "^0.5.0", "minstache": "^1.2.0", "mkdirp": "^0.5.1", "once": "^1.3.3", "rimraf": "^2.4.3", "sliced": "1.0.1", "split2": "^2.0.1" } }, "sha512-rh9gT9gJdSvVWAYQELxnDVgx/o44XotxJACR6Iuh0hJyww5zkegJaLl4/yMGeLn2ftY2QDrbio8XyxQWhXIlNA=="],
+
+ "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="],
+
+ "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="],
+
+ "normalize-path": ["normalize-path@1.0.0", "", {}, "sha512-7WyT0w8jhpDStXRq5836AMmihQwq2nrUVQrgjvUo/p/NZf9uy/MeJ246lBJVmWuYXMlJuG9BNZHF0hWjfTbQUA=="],
+
+ "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="],
+
+ "nugget": ["nugget@2.2.0", "", { "dependencies": { "debug": "^2.1.3", "minimist": "^1.1.0", "pretty-bytes": "^4.0.2", "progress-stream": "^1.1.0", "request": "^2.45.0", "single-line-log": "^1.1.2", "throttleit": "0.0.2" }, "bin": { "nugget": "bin.js" } }, "sha512-I4Yt4dRPes82Tx/s7qDn8z1cA2pmZy2bOJiTdcb/BZJ1LJkEYd9GqunQD37unPUPjdmW6dkkVZmxN+8Gxt6Xlg=="],
+
+ "number-is-nan": ["number-is-nan@1.0.1", "", {}, "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ=="],
+
+ "oauth-sign": ["oauth-sign@0.9.0", "", {}, "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="],
+
+ "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
+
+ "object-keys": ["object-keys@0.4.0", "", {}, "sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw=="],
+
+ "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="],
+
+ "onetime": ["onetime@2.0.1", "", { "dependencies": { "mimic-fn": "^1.0.0" } }, "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ=="],
+
+ "opener": ["opener@1.4.3", "", { "bin": { "opener": "opener.js" } }, "sha512-4Im9TrPJcjAYyGR5gBe3yZnBzw5n3Bfh1ceHHGNOpMurINKc6RdSIPXMyon4BZacJbJc36lLkhipioGbWh5pwg=="],
+
+ "optimist": ["optimist@0.6.1", "", { "dependencies": { "minimist": "~0.0.1", "wordwrap": "~0.0.2" } }, "sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g=="],
+
+ "optionator": ["optionator@0.8.3", "", { "dependencies": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.6", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", "word-wrap": "~1.2.3" } }, "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA=="],
+
+ "os-homedir": ["os-homedir@1.0.2", "", {}, "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ=="],
+
+ "os-tmpdir": ["os-tmpdir@1.0.2", "", {}, "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g=="],
+
+ "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
+
+ "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="],
+
+ "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="],
+
+ "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
+
+ "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="],
+
+ "path-is-inside": ["path-is-inside@1.0.2", "", {}, "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w=="],
+
+ "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
+
+ "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="],
+
+ "pend": ["pend@1.2.0", "", {}, "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="],
+
+ "performance-now": ["performance-now@2.1.0", "", {}, "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="],
+
+ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
+
+ "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
+
+ "pinkie": ["pinkie@2.0.4", "", {}, "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg=="],
+
+ "pinkie-promise": ["pinkie-promise@2.0.1", "", { "dependencies": { "pinkie": "^2.0.0" } }, "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw=="],
+
+ "pkg-dir": ["pkg-dir@4.2.0", "", { "dependencies": { "find-up": "^4.0.0" } }, "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ=="],
+
+ "pluralize": ["pluralize@7.0.0", "", {}, "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow=="],
+
+ "portfinder": ["portfinder@1.0.37", "", { "dependencies": { "async": "^3.2.6", "debug": "^4.3.6" } }, "sha512-yuGIEjDAYnnOex9ddMnKZEMFE0CcGo6zbfzDklkmT1m5z734ss6JMzN9rNB3+RR7iS+F10D4/BVIaXOyh8PQKw=="],
+
+ "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="],
+
+ "postcss-calc": ["postcss-calc@10.1.1", "", { "dependencies": { "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.38" } }, "sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw=="],
+
+ "postcss-colormin": ["postcss-colormin@7.0.4", "", { "dependencies": { "browserslist": "^4.25.1", "caniuse-api": "^3.0.0", "colord": "^2.9.3", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-ziQuVzQZBROpKpfeDwmrG+Vvlr0YWmY/ZAk99XD+mGEBuEojoFekL41NCsdhyNUtZI7DPOoIWIR7vQQK9xwluw=="],
+
+ "postcss-convert-values": ["postcss-convert-values@7.0.6", "", { "dependencies": { "browserslist": "^4.25.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-MD/eb39Mr60hvgrqpXsgbiqluawYg/8K4nKsqRsuDX9f+xN1j6awZCUv/5tLH8ak3vYp/EMXwdcnXvfZYiejCQ=="],
+
+ "postcss-discard-comments": ["postcss-discard-comments@7.0.4", "", { "dependencies": { "postcss-selector-parser": "^7.1.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-6tCUoql/ipWwKtVP/xYiFf1U9QgJ0PUvxN7pTcsQ8Ns3Fnwq1pU5D5s1MhT/XySeLq6GXNvn37U46Ded0TckWg=="],
+
+ "postcss-discard-duplicates": ["postcss-discard-duplicates@7.0.2", "", { "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w=="],
+
+ "postcss-discard-empty": ["postcss-discard-empty@7.0.1", "", { "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg=="],
+
+ "postcss-discard-overridden": ["postcss-discard-overridden@7.0.1", "", { "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg=="],
+
+ "postcss-merge-longhand": ["postcss-merge-longhand@7.0.5", "", { "dependencies": { "postcss-value-parser": "^4.2.0", "stylehacks": "^7.0.5" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw=="],
+
+ "postcss-merge-rules": ["postcss-merge-rules@7.0.6", "", { "dependencies": { "browserslist": "^4.25.1", "caniuse-api": "^3.0.0", "cssnano-utils": "^5.0.1", "postcss-selector-parser": "^7.1.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-2jIPT4Tzs8K87tvgCpSukRQ2jjd+hH6Bb8rEEOUDmmhOeTcqDg5fEFK8uKIu+Pvc3//sm3Uu6FRqfyv7YF7+BQ=="],
+
+ "postcss-minify-font-values": ["postcss-minify-font-values@7.0.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ=="],
+
+ "postcss-minify-gradients": ["postcss-minify-gradients@7.0.1", "", { "dependencies": { "colord": "^2.9.3", "cssnano-utils": "^5.0.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-X9JjaysZJwlqNkJbUDgOclyG3jZEpAMOfof6PUZjPnPrePnPG62pS17CjdM32uT1Uq1jFvNSff9l7kNbmMSL2A=="],
+
+ "postcss-minify-params": ["postcss-minify-params@7.0.4", "", { "dependencies": { "browserslist": "^4.25.1", "cssnano-utils": "^5.0.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-3OqqUddfH8c2e7M35W6zIwv7jssM/3miF9cbCSb1iJiWvtguQjlxZGIHK9JRmc8XAKmE2PFGtHSM7g/VcW97sw=="],
+
+ "postcss-minify-selectors": ["postcss-minify-selectors@7.0.5", "", { "dependencies": { "cssesc": "^3.0.0", "postcss-selector-parser": "^7.1.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-x2/IvofHcdIrAm9Q+p06ZD1h6FPcQ32WtCRVodJLDR+WMn8EVHI1kvLxZuGKz/9EY5nAmI6lIQIrpo4tBy5+ug=="],
+
+ "postcss-modules-extract-imports": ["postcss-modules-extract-imports@3.1.0", "", { "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q=="],
+
+ "postcss-modules-local-by-default": ["postcss-modules-local-by-default@4.2.0", "", { "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.1.0" }, "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw=="],
+
+ "postcss-modules-scope": ["postcss-modules-scope@3.2.1", "", { "dependencies": { "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA=="],
+
+ "postcss-modules-values": ["postcss-modules-values@4.0.0", "", { "dependencies": { "icss-utils": "^5.0.0" }, "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ=="],
+
+ "postcss-normalize-charset": ["postcss-normalize-charset@7.0.1", "", { "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ=="],
+
+ "postcss-normalize-display-values": ["postcss-normalize-display-values@7.0.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ=="],
+
+ "postcss-normalize-positions": ["postcss-normalize-positions@7.0.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ=="],
+
+ "postcss-normalize-repeat-style": ["postcss-normalize-repeat-style@7.0.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ=="],
+
+ "postcss-normalize-string": ["postcss-normalize-string@7.0.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ=="],
+
+ "postcss-normalize-timing-functions": ["postcss-normalize-timing-functions@7.0.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg=="],
+
+ "postcss-normalize-unicode": ["postcss-normalize-unicode@7.0.4", "", { "dependencies": { "browserslist": "^4.25.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-LvIURTi1sQoZqj8mEIE8R15yvM+OhbR1avynMtI9bUzj5gGKR/gfZFd8O7VMj0QgJaIFzxDwxGl/ASMYAkqO8g=="],
+
+ "postcss-normalize-url": ["postcss-normalize-url@7.0.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ=="],
+
+ "postcss-normalize-whitespace": ["postcss-normalize-whitespace@7.0.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA=="],
+
+ "postcss-ordered-values": ["postcss-ordered-values@7.0.2", "", { "dependencies": { "cssnano-utils": "^5.0.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw=="],
+
+ "postcss-reduce-initial": ["postcss-reduce-initial@7.0.4", "", { "dependencies": { "browserslist": "^4.25.1", "caniuse-api": "^3.0.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-rdIC9IlMBn7zJo6puim58Xd++0HdbvHeHaPgXsimMfG1ijC5A9ULvNLSE0rUKVJOvNMcwewW4Ga21ngyJjY/+Q=="],
+
+ "postcss-reduce-transforms": ["postcss-reduce-transforms@7.0.1", "", { "dependencies": { "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g=="],
+
+ "postcss-selector-parser": ["postcss-selector-parser@7.1.0", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA=="],
+
+ "postcss-svgo": ["postcss-svgo@7.1.0", "", { "dependencies": { "postcss-value-parser": "^4.2.0", "svgo": "^4.0.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-KnAlfmhtoLz6IuU3Sij2ycusNs4jPW+QoFE5kuuUOK8awR6tMxZQrs5Ey3BUz7nFCzT3eqyFgqkyrHiaU2xx3w=="],
+
+ "postcss-unique-selectors": ["postcss-unique-selectors@7.0.4", "", { "dependencies": { "postcss-selector-parser": "^7.1.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-pmlZjsmEAG7cHd7uK3ZiNSW6otSZ13RHuZ/4cDN/bVglS5EpF2r2oxY99SuOHa8m7AWoBCelTS3JPpzsIs8skQ=="],
+
+ "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="],
+
+ "preact": ["preact@8.5.3", "", {}, "sha512-O3kKP+1YdgqHOFsZF2a9JVdtqD+RPzCQc3rP+Ualf7V6rmRDchZ9MJbiGTT7LuyqFKZqlHSOyO/oMFmI2lVTsw=="],
+
+ "prelude-ls": ["prelude-ls@1.1.2", "", {}, "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w=="],
+
+ "pretty-bytes": ["pretty-bytes@4.0.2", "", {}, "sha512-yJAF+AjbHKlxQ8eezMd/34Mnj/YTQ3i6kLzvVsH4l/BfIFtp444n0wVbnsn66JimZ9uBofv815aRp1zCppxlWw=="],
+
+ "private": ["private@0.1.8", "", {}, "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg=="],
+
+ "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="],
+
+ "progress": ["progress@2.0.3", "", {}, "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="],
+
+ "progress-stream": ["progress-stream@1.2.0", "", { "dependencies": { "speedometer": "~0.1.2", "through2": "~0.2.3" } }, "sha512-MIBPjZz6oGNSw5rn2mSp+nP9FGoaVo6QsPyPVEaD4puilz5hZNa3kfnrlqRNYFsugslbU3An4mnkLLtZOaWvrA=="],
+
+ "pseudomap": ["pseudomap@1.0.2", "", {}, "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ=="],
+
+ "psl": ["psl@1.15.0", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w=="],
+
+ "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
+
+ "qs": ["qs@2.3.3", "", {}, "sha512-f5M0HQqZWkzU8GELTY8LyMrGkr3bPjKoFtTkwUEqJQbcljbeK8M7mliP9Ia2xoOI6oMerp+QPS7oYJtpGmWe/A=="],
+
+ "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="],
+
+ "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="],
+
+ "readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="],
+
+ "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
+
+ "rechoir": ["rechoir@0.8.0", "", { "dependencies": { "resolve": "^1.20.0" } }, "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ=="],
+
+ "regenerate": ["regenerate@1.4.2", "", {}, "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="],
+
+ "regenerate-unicode-properties": ["regenerate-unicode-properties@10.2.0", "", { "dependencies": { "regenerate": "^1.4.2" } }, "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA=="],
+
+ "regenerator-runtime": ["regenerator-runtime@0.11.1", "", {}, "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="],
+
+ "regenerator-transform": ["regenerator-transform@0.10.1", "", { "dependencies": { "babel-runtime": "^6.18.0", "babel-types": "^6.19.0", "private": "^0.1.6" } }, "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q=="],
+
+ "regexpp": ["regexpp@1.1.0", "", {}, "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw=="],
+
+ "regexpu-core": ["regexpu-core@2.0.0", "", { "dependencies": { "regenerate": "^1.2.1", "regjsgen": "^0.2.0", "regjsparser": "^0.1.4" } }, "sha512-tJ9+S4oKjxY8IZ9jmjnp/mtytu1u3iyIQAfmI51IKWH6bFf7XR1ybtaO6j7INhZKXOTYADk7V5qxaqLkmNxiZQ=="],
+
+ "regjsgen": ["regjsgen@0.2.0", "", {}, "sha512-x+Y3yA24uF68m5GA+tBjbGYo64xXVJpbToBaWCoSNSc1hdk6dfctaRWrNFTVJZIIhL5GxW8zwjoixbnifnK59g=="],
+
+ "regjsparser": ["regjsparser@0.1.5", "", { "dependencies": { "jsesc": "~0.5.0" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-jlQ9gYLfk2p3V5Ag5fYhA7fv7OHzd1KUH0PRP46xc3TgwjwgROIW572AfYg/X9kaNq/LJnu6oJcFRXlIrGoTRw=="],
+
+ "repeat-string": ["repeat-string@1.6.1", "", {}, "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w=="],
+
+ "repeating": ["repeating@2.0.1", "", { "dependencies": { "is-finite": "^1.0.0" } }, "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A=="],
+
+ "request": ["request@2.88.2", "", { "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", "caseless": "~0.12.0", "combined-stream": "~1.0.6", "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" } }, "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw=="],
+
+ "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
+
+ "require-uncached": ["require-uncached@1.0.3", "", { "dependencies": { "caller-path": "^0.1.0", "resolve-from": "^1.0.0" } }, "sha512-Xct+41K3twrbBHdxAgMoOS+cNcoqIjfM2/VxBF4LL2hVph7YsF8VSKyQ3BDFZwEVbok9yeDl2le/qo0S77WG2w=="],
+
+ "requires-port": ["requires-port@1.0.0", "", {}, "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="],
+
+ "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="],
+
+ "resolve-cwd": ["resolve-cwd@3.0.0", "", { "dependencies": { "resolve-from": "^5.0.0" } }, "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg=="],
+
+ "resolve-from": ["resolve-from@1.0.1", "", {}, "sha512-kT10v4dhrlLNcnO084hEjvXCI1wUG9qZLoz2RogxqDQQYy7IxjI/iMUkOtQTNEh6rzHxvdQWHsJyel1pKOVCxg=="],
+
+ "restore-cursor": ["restore-cursor@2.0.0", "", { "dependencies": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" } }, "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q=="],
+
+ "right-align": ["right-align@0.1.3", "", { "dependencies": { "align-text": "^0.1.1" } }, "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg=="],
+
+ "rimraf": ["rimraf@2.7.1", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "./bin.js" } }, "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w=="],
+
+ "run-async": ["run-async@2.4.1", "", {}, "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ=="],
+
+ "rx-lite": ["rx-lite@4.0.8", "", {}, "sha512-Cun9QucwK6MIrp3mry/Y7hqD1oFqTYLQ4pGxaHTjIdaFDWRGGLikqp6u8LcWJnzpoALg9hap+JGk8sFIUuEGNA=="],
+
+ "rx-lite-aggregates": ["rx-lite-aggregates@4.0.8", "", { "dependencies": { "rx-lite": "*" } }, "sha512-3xPNZGW93oCjiO7PtKxRK6iOVYBWBvtf9QHDfU23Oc+dLIQmAV//UnyXV/yihv81VS/UqoQPk4NegS8EFi55Hg=="],
+
+ "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
+
+ "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
+
+ "sass": ["sass@1.89.2", "", { "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA=="],
+
+ "sass-loader": ["sass-loader@16.0.5", "", { "dependencies": { "neo-async": "^2.6.2" }, "peerDependencies": { "@rspack/core": "0.x || 1.x", "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" }, "optionalPeers": ["@rspack/core", "node-sass", "sass", "sass-embedded", "webpack"] }, "sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw=="],
+
+ "sax": ["sax@1.4.1", "", {}, "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg=="],
+
+ "schema-utils": ["schema-utils@4.3.2", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ=="],
+
+ "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
+
+ "serialize-javascript": ["serialize-javascript@6.0.2", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g=="],
+
+ "shallow-clone": ["shallow-clone@3.0.1", "", { "dependencies": { "kind-of": "^6.0.2" } }, "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA=="],
+
+ "shebang-command": ["shebang-command@1.2.0", "", { "dependencies": { "shebang-regex": "^1.0.0" } }, "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg=="],
+
+ "shebang-regex": ["shebang-regex@1.0.0", "", {}, "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ=="],
+
+ "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
+
+ "single-line-log": ["single-line-log@1.1.2", "", { "dependencies": { "string-width": "^1.0.1" } }, "sha512-awzaaIPtYFdexLr6TBpcZSGPB6D1RInNO/qNetgaJloPDF/D0GkVtLvGEp8InfmLV7CyLyQ5fIRP+tVN/JmWQA=="],
+
+ "slash": ["slash@1.0.0", "", {}, "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg=="],
+
+ "slice-ansi": ["slice-ansi@1.0.0", "", { "dependencies": { "is-fullwidth-code-point": "^2.0.0" } }, "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg=="],
+
+ "sliced": ["sliced@1.0.1", "", {}, "sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA=="],
+
+ "source-list-map": ["source-list-map@2.0.1", "", {}, "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw=="],
+
+ "source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="],
+
+ "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
+
+ "source-map-support": ["source-map-support@0.4.18", "", { "dependencies": { "source-map": "^0.5.6" } }, "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA=="],
+
+ "speedometer": ["speedometer@0.1.4", "", {}, "sha512-phdEoDlA6EUIVtzwq1UiNMXDUogczp204aYF/yfOhjNePWFfIpBJ1k5wLMuXQhEOOMjuTJEcc4vdZa+vuP+n/Q=="],
+
+ "split2": ["split2@2.2.0", "", { "dependencies": { "through2": "^2.0.2" } }, "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw=="],
+
+ "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="],
+
+ "sshpk": ["sshpk@1.18.0", "", { "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", "bcrypt-pbkdf": "^1.0.0", "dashdash": "^1.12.0", "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", "jsbn": "~0.1.0", "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" }, "bin": { "sshpk-conv": "bin/sshpk-conv", "sshpk-sign": "bin/sshpk-sign", "sshpk-verify": "bin/sshpk-verify" } }, "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ=="],
+
+ "string-width": ["string-width@2.1.1", "", { "dependencies": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" } }, "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw=="],
+
+ "string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="],
+
+ "strip-ansi": ["strip-ansi@4.0.0", "", { "dependencies": { "ansi-regex": "^3.0.0" } }, "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow=="],
+
+ "strip-indent": ["strip-indent@2.0.0", "", {}, "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA=="],
+
+ "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="],
+
+ "stylehacks": ["stylehacks@7.0.6", "", { "dependencies": { "browserslist": "^4.25.1", "postcss-selector-parser": "^7.1.0" }, "peerDependencies": { "postcss": "^8.4.32" } }, "sha512-iitguKivmsueOmTO0wmxURXBP8uqOO+zikLGZ7Mm9e/94R4w5T999Js2taS/KBOnQ/wdC3jN3vNSrkGDrlnqQg=="],
+
+ "sumchecker": ["sumchecker@1.3.1", "", { "dependencies": { "debug": "^2.2.0", "es6-promise": "^4.0.5" } }, "sha512-ZfWTnMBdeHaXR7ncH96vRUI07B+wLuXxGPGUMR+EM4QJRJoD535ALIdpc+vHB8eA+1DXJztu3CgHZ1zEhbDF4A=="],
+
+ "supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="],
+
+ "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
+
+ "svgo": ["svgo@4.0.0", "", { "dependencies": { "commander": "^11.1.0", "css-select": "^5.1.0", "css-tree": "^3.0.1", "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.1.1", "sax": "^1.4.1" }, "bin": "./bin/svgo.js" }, "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw=="],
+
+ "table": ["table@4.0.2", "", { "dependencies": { "ajv": "^5.2.3", "ajv-keywords": "^2.1.0", "chalk": "^2.1.0", "lodash": "^4.17.4", "slice-ansi": "1.0.0", "string-width": "^2.1.1" } }, "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA=="],
+
+ "tapable": ["tapable@2.2.2", "", {}, "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg=="],
+
+ "terser": ["terser@5.43.1", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.14.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg=="],
+
+ "terser-webpack-plugin": ["terser-webpack-plugin@5.3.14", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "peerDependencies": { "webpack": "^5.1.0" } }, "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw=="],
+
+ "text-table": ["text-table@0.2.0", "", {}, "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="],
+
+ "three": ["three@0.86.0", "", {}, "sha512-ixxsjKcTk/s8V1xRCIvGAD0znkfV1FtMyujAmb9rG9qp50/Sw9xcInDG0Ww2NHGBd6DFjBq07c0EK1VKar4Uug=="],
+
+ "throttleit": ["throttleit@0.0.2", "", {}, "sha512-HtlTFeyYs1elDM2txiIGsdXHaq8kffVaZH/QEBRbo95zQqzlsBx5ELKhkPOZVad9OK9oxzwx6UrQN8Vfh/+yag=="],
+
+ "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="],
+
+ "through2": ["through2@2.0.5", "", { "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" } }, "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ=="],
+
+ "tmp": ["tmp@0.0.33", "", { "dependencies": { "os-tmpdir": "~1.0.2" } }, "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw=="],
+
+ "to-fast-properties": ["to-fast-properties@1.0.3", "", {}, "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og=="],
+
+ "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
+
+ "tough-cookie": ["tough-cookie@2.5.0", "", { "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" } }, "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g=="],
+
+ "trim-right": ["trim-right@1.0.1", "", {}, "sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw=="],
+
+ "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="],
+
+ "tweetnacl": ["tweetnacl@0.14.5", "", {}, "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="],
+
+ "type-check": ["type-check@0.3.2", "", { "dependencies": { "prelude-ls": "~1.1.2" } }, "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg=="],
+
+ "typedarray": ["typedarray@0.0.6", "", {}, "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="],
+
+ "uglify-js": ["uglify-js@2.8.29", "", { "dependencies": { "source-map": "~0.5.1", "yargs": "~3.10.0" }, "optionalDependencies": { "uglify-to-browserify": "~1.0.0" }, "bin": { "uglifyjs": "bin/uglifyjs" } }, "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w=="],
+
+ "uglify-to-browserify": ["uglify-to-browserify@1.0.2", "", {}, "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q=="],
+
+ "uglifyjs-webpack-plugin": ["uglifyjs-webpack-plugin@0.4.6", "", { "dependencies": { "source-map": "^0.5.6", "uglify-js": "^2.8.29", "webpack-sources": "^1.0.1" }, "peerDependencies": { "webpack": "^1.9 || ^2 || ^2.1.0-beta || ^2.2.0-rc || ^3.0.0" } }, "sha512-TNM20HMW67kxHRNCZdvLyiwE1ST6WyY5Ae+TG55V81NpvNwJ9+V4/po4LHA1R9afV/WrqzfedG2UJCk2+swirw=="],
+
+ "unicode-canonical-property-names-ecmascript": ["unicode-canonical-property-names-ecmascript@2.0.1", "", {}, "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg=="],
+
+ "unicode-match-property-ecmascript": ["unicode-match-property-ecmascript@2.0.0", "", { "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" } }, "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q=="],
+
+ "unicode-match-property-value-ecmascript": ["unicode-match-property-value-ecmascript@2.2.0", "", {}, "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg=="],
+
+ "unicode-property-aliases-ecmascript": ["unicode-property-aliases-ecmascript@2.1.0", "", {}, "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w=="],
+
+ "union": ["union@0.4.6", "", { "dependencies": { "qs": "~2.3.3" } }, "sha512-2qtrvSgD0GKotLRCNYkIMUOzoaHjXKCtbAP0kc5Po6D+RWTBb+BxlcHlHCYcf+Y+YM7eQicPgAg9mnWQvtoFVA=="],
+
+ "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="],
+
+ "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="],
+
+ "url-join": ["url-join@2.0.5", "", {}, "sha512-c2H1fIgpUdwFRIru9HFno5DT73Ok8hg5oOb5AT3ayIgvCRfxgs2jyt5Slw8kEB7j3QUr6yJmMPDT/odjk7jXow=="],
+
+ "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
+
+ "uuid": ["uuid@3.4.0", "", { "bin": { "uuid": "./bin/uuid" } }, "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="],
+
+ "verror": ["verror@1.10.0", "", { "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw=="],
+
+ "watchpack": ["watchpack@2.4.4", "", { "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" } }, "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA=="],
+
+ "webpack": ["webpack@5.100.2", "", { "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.15.0", "acorn-import-phases": "^1.0.3", "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.2", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^4.3.2", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.1", "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" } }, "sha512-QaNKAvGCDRh3wW1dsDjeMdDXwZm2vqq3zn6Pvq4rHOEOGSaUMgOOjG2Y9ZbIGzpfkJk9ZYTHpDqgDfeBDcnLaw=="],
+
+ "webpack-cli": ["webpack-cli@6.0.1", "", { "dependencies": { "@discoveryjs/json-ext": "^0.6.1", "@webpack-cli/configtest": "^3.0.1", "@webpack-cli/info": "^3.0.1", "@webpack-cli/serve": "^3.0.1", "colorette": "^2.0.14", "commander": "^12.1.0", "cross-spawn": "^7.0.3", "envinfo": "^7.14.0", "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", "interpret": "^3.1.1", "rechoir": "^0.8.0", "webpack-merge": "^6.0.1" }, "peerDependencies": { "webpack": "^5.82.0" }, "bin": { "webpack-cli": "./bin/cli.js" } }, "sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw=="],
+
+ "webpack-merge": ["webpack-merge@6.0.1", "", { "dependencies": { "clone-deep": "^4.0.1", "flat": "^5.0.2", "wildcard": "^2.0.1" } }, "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg=="],
+
+ "webpack-sources": ["webpack-sources@1.4.3", "", { "dependencies": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" } }, "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ=="],
+
+ "whatwg-fetch": ["whatwg-fetch@2.0.4", "", {}, "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng=="],
+
+ "which": ["which@1.3.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "./bin/which" } }, "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="],
+
+ "wildcard": ["wildcard@2.0.1", "", {}, "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ=="],
+
+ "window-size": ["window-size@0.1.0", "", {}, "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg=="],
+
+ "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="],
+
+ "wordwrap": ["wordwrap@0.0.3", "", {}, "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw=="],
+
+ "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],
+
+ "write": ["write@0.2.1", "", { "dependencies": { "mkdirp": "^0.5.1" } }, "sha512-CJ17OoULEKXpA5pef3qLj5AxTJ6mSt7g84he2WIskKwqFO4T97d5V7Tadl0DYDk7qyUOQD5WlUlOMChaYrhxeA=="],
+
+ "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="],
+
+ "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
+
+ "yargs": ["yargs@3.10.0", "", { "dependencies": { "camelcase": "^1.0.2", "cliui": "^2.1.0", "decamelize": "^1.0.0", "window-size": "0.1.0" } }, "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A=="],
+
+ "yauzl": ["yauzl@2.10.0", "", { "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g=="],
+
+ "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
+
+ "@babel/generator/jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
+
+ "@babel/helper-compilation-targets/browserslist": ["browserslist@4.25.1", "", { "dependencies": { "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw=="],
+
+ "@babel/helper-create-regexp-features-plugin/regexpu-core": ["regexpu-core@6.2.0", "", { "dependencies": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.2.0", "regjsgen": "^0.8.0", "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" } }, "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA=="],
+
+ "@jest/types/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
+
+ "acorn-jsx/acorn": ["acorn@3.3.0", "", { "bin": { "acorn": "./bin/acorn" } }, "sha512-OLUyIIZ7mF5oaAUT1w0TFqQS81q3saT46x8t7ukpPjMNk+nbs4ZHhs7ToV8EWnLYLepjETXd4XaCE4uxkMeqUw=="],
+
+ "ajv-formats/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="],
+
+ "ajv-keywords/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="],
+
+ "ajv-keywords/fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
+
+ "align-text/kind-of": ["kind-of@3.2.2", "", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="],
+
+ "babel-code-frame/chalk": ["chalk@1.1.3", "", { "dependencies": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", "has-ansi": "^2.0.0", "strip-ansi": "^3.0.0", "supports-color": "^2.0.0" } }, "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A=="],
+
+ "babel-code-frame/js-tokens": ["js-tokens@3.0.2", "", {}, "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg=="],
+
+ "babel-core/convert-source-map": ["convert-source-map@1.9.0", "", {}, "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="],
+
+ "babel-core/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
+
+ "babel-core/json5": ["json5@0.5.1", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw=="],
+
+ "babel-generator/jsesc": ["jsesc@1.3.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA=="],
+
+ "babel-preset-env/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="],
+
+ "babel-traverse/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
+
+ "babel-traverse/globals": ["globals@9.18.0", "", {}, "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="],
+
+ "caniuse-api/browserslist": ["browserslist@4.25.1", "", { "dependencies": { "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw=="],
+
+ "chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="],
+
+ "cliui/wordwrap": ["wordwrap@0.0.2", "", {}, "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q=="],
+
+ "core-js-compat/browserslist": ["browserslist@4.25.1", "", { "dependencies": { "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw=="],
+
+ "cross-spawn/lru-cache": ["lru-cache@4.1.5", "", { "dependencies": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" } }, "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g=="],
+
+ "css-loader/semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="],
+
+ "cssnano-preset-default/browserslist": ["browserslist@4.25.1", "", { "dependencies": { "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw=="],
+
+ "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="],
+
+ "electron-download/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
+
+ "electron-download/path-exists": ["path-exists@2.1.0", "", { "dependencies": { "pinkie-promise": "^2.0.0" } }, "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ=="],
+
+ "electron-download/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="],
+
+ "enqueue/sliced": ["sliced@0.0.5", "", {}, "sha512-9bYT917D6H3+q8GlQBJmLVz3bc4OeVGfZ2BB12wvLnluTGfG6/8UdOUbKJDW1EEx9SZMDbjnatkau5/XcUeyOw=="],
+
+ "eslint/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="],
+
+ "eslint/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="],
+
+ "espree/acorn": ["acorn@5.7.4", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg=="],
+
+ "esquery/estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
+
+ "esrecurse/estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
+
+ "extract-text-webpack-plugin/schema-utils": ["schema-utils@0.3.0", "", { "dependencies": { "ajv": "^5.0.0" } }, "sha512-QaVYBaD9U8scJw2EBWnCBY+LJ0AD+/2edTaigDs0XLDLBfJmSUK9KGqktg1rb32U3z4j/XwvFwHHH1YfbYFd7Q=="],
+
+ "extract-zip/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
+
+ "flat-cache/rimraf": ["rimraf@2.6.3", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "./bin.js" } }, "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA=="],
+
+ "har-validator/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="],
+
+ "has-ansi/ansi-regex": ["ansi-regex@2.1.1", "", {}, "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="],
+
+ "jest-util/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
+
+ "jest-util/ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="],
+
+ "loader-utils/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="],
+
+ "loose-envify/js-tokens": ["js-tokens@3.0.2", "", {}, "sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg=="],
+
+ "minstache/commander": ["commander@1.0.4", "", { "dependencies": { "keypress": "0.1.x" } }, "sha512-Xz0JOF7NqSubDnWmw7qvX1FuIpCsV62ci/gkpa2NFlm+roeMniBtbxK8QePjs762ZGsuhKaGgcb83eaBiSJ16A=="],
+
+ "nightmare/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
+
+ "nugget/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
+
+ "optimist/minimist": ["minimist@0.0.10", "", {}, "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw=="],
+
+ "pkg-dir/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="],
+
+ "portfinder/async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="],
+
+ "postcss-colormin/browserslist": ["browserslist@4.25.1", "", { "dependencies": { "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw=="],
+
+ "postcss-convert-values/browserslist": ["browserslist@4.25.1", "", { "dependencies": { "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw=="],
+
+ "postcss-merge-rules/browserslist": ["browserslist@4.25.1", "", { "dependencies": { "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw=="],
+
+ "postcss-minify-params/browserslist": ["browserslist@4.25.1", "", { "dependencies": { "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw=="],
+
+ "postcss-normalize-unicode/browserslist": ["browserslist@4.25.1", "", { "dependencies": { "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw=="],
+
+ "postcss-reduce-initial/browserslist": ["browserslist@4.25.1", "", { "dependencies": { "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw=="],
+
+ "progress-stream/through2": ["through2@0.2.3", "", { "dependencies": { "readable-stream": "~1.1.9", "xtend": "~2.1.1" } }, "sha512-mLa8Bn2mZurjyomGKWRu3Bo2mvoQojFks9NvOK8H+k4kDJNkdEqG522KFZsEFBEl6rKkxTgFbE5+OPcgfvPEHA=="],
+
+ "readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="],
+
+ "request/qs": ["qs@6.5.3", "", {}, "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA=="],
+
+ "resolve-cwd/resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="],
+
+ "schema-utils/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="],
+
+ "single-line-log/string-width": ["string-width@1.0.2", "", { "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } }, "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw=="],
+
+ "string_decoder/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="],
+
+ "stylehacks/browserslist": ["browserslist@4.25.1", "", { "dependencies": { "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw=="],
+
+ "sumchecker/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
+
+ "svgo/commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="],
+
+ "table/ajv-keywords": ["ajv-keywords@2.1.1", "", { "peerDependencies": { "ajv": "^5.0.0" } }, "sha512-ZFztHzVRdGLAzJmpUT9LNFLe1YiVOEylcaNpEutM26PVTCtOD919IMfD01CgbRouB42Dd9atjx1HseC15DgOZA=="],
+
+ "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="],
+
+ "terser/source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="],
+
+ "terser-webpack-plugin/jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="],
+
+ "update-browserslist-db/browserslist": ["browserslist@4.25.1", "", { "dependencies": { "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw=="],
+
+ "verror/core-util-is": ["core-util-is@1.0.2", "", {}, "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="],
+
+ "webpack/browserslist": ["browserslist@4.25.1", "", { "dependencies": { "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw=="],
+
+ "webpack/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="],
+
+ "webpack/webpack-sources": ["webpack-sources@3.3.3", "", {}, "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg=="],
+
+ "webpack-cli/cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
+
+ "webpack-sources/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
+
+ "@babel/helper-create-regexp-features-plugin/regexpu-core/regjsgen": ["regjsgen@0.8.0", "", {}, "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q=="],
+
+ "@babel/helper-create-regexp-features-plugin/regexpu-core/regjsparser": ["regjsparser@0.12.0", "", { "dependencies": { "jsesc": "~3.0.2" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ=="],
+
+ "@jest/types/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
+
+ "@jest/types/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
+
+ "ajv-formats/ajv/fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
+
+ "ajv-formats/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
+
+ "ajv-keywords/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
+
+ "babel-code-frame/chalk/ansi-styles": ["ansi-styles@2.2.1", "", {}, "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA=="],
+
+ "babel-code-frame/chalk/strip-ansi": ["strip-ansi@3.0.1", "", { "dependencies": { "ansi-regex": "^2.0.0" } }, "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg=="],
+
+ "babel-code-frame/chalk/supports-color": ["supports-color@2.0.0", "", {}, "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g=="],
+
+ "babel-core/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
+
+ "babel-traverse/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
+
+ "chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="],
+
+ "cross-spawn/lru-cache/yallist": ["yallist@2.1.2", "", {}, "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A=="],
+
+ "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="],
+
+ "electron-download/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
+
+ "extract-zip/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
+
+ "har-validator/ajv/fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
+
+ "har-validator/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
+
+ "jest-util/chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
+
+ "jest-util/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
+
+ "nightmare/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
+
+ "nugget/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
+
+ "pkg-dir/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="],
+
+ "progress-stream/through2/readable-stream": ["readable-stream@1.1.14", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", "isarray": "0.0.1", "string_decoder": "~0.10.x" } }, "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ=="],
+
+ "progress-stream/through2/xtend": ["xtend@2.1.2", "", { "dependencies": { "object-keys": "~0.4.0" } }, "sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ=="],
+
+ "schema-utils/ajv/fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
+
+ "schema-utils/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
+
+ "single-line-log/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@1.0.0", "", { "dependencies": { "number-is-nan": "^1.0.0" } }, "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw=="],
+
+ "single-line-log/string-width/strip-ansi": ["strip-ansi@3.0.1", "", { "dependencies": { "ansi-regex": "^2.0.0" } }, "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg=="],
+
+ "sumchecker/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
+
+ "terser/source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
+
+ "webpack-cli/cross-spawn/shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
+
+ "webpack-cli/cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
+
+ "@babel/helper-create-regexp-features-plugin/regexpu-core/regjsparser/jsesc": ["jsesc@3.0.2", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g=="],
+
+ "@jest/types/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
+
+ "babel-code-frame/chalk/strip-ansi/ansi-regex": ["ansi-regex@2.1.1", "", {}, "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="],
+
+ "jest-util/chalk/ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
+
+ "pkg-dir/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="],
+
+ "progress-stream/through2/readable-stream/isarray": ["isarray@0.0.1", "", {}, "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="],
+
+ "progress-stream/through2/readable-stream/string_decoder": ["string_decoder@0.10.31", "", {}, "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="],
+
+ "single-line-log/string-width/strip-ansi/ansi-regex": ["ansi-regex@2.1.1", "", {}, "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="],
+
+ "webpack-cli/cross-spawn/shebang-command/shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
+
+ "@jest/types/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
+
+ "jest-util/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
+
+ "pkg-dir/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="],
+ }
+}
diff --git a/dist/akko.css b/dist/akko.css
index a23f2f9..4446bed 100644
--- a/dist/akko.css
+++ b/dist/akko.css
@@ -1,4 +1,7 @@
-/*! Akko v0.1.0 | (c) Timur Kuzhagaliyev | github.com/TimboKZ/Akko */
+/*! Akko v0.1.1 | (c) Timur Kuzhagaliyev | github.com/TimboKZ/Akko */
+/*!*****************************************************************************************************************************************************************!*\
+ !*** css ./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].use[1]!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].use[2]!./sass/main.sass ***!
+ \*****************************************************************************************************************************************************************/
.akko-ui {
font-family: Arial, "Helvetica Neue", Helvetica, sans-serif;
position: absolute;
@@ -8,60 +11,75 @@
z-index: 1;
opacity: 0.2;
-webkit-transition: opacity 200ms ease-in-out;
- transition: opacity 200ms ease-in-out; }
- .akko-ui:hover {
- opacity: 1; }
- .akko-ui-container {
- background-color: rgba(255, 255, 255, 0.05);
- display: inline-block;
- position: relative;
- font-size: 1rem;
- padding: 10px;
- color: #fff; }
- .akko-ui-container-title {
- background: rgba(255, 255, 255, 0.05);
- text-align: center;
- padding: 5px 10px; }
- .akko-ui-container-list-item {
- color: #fff !important;
- text-decoration: none;
- margin-top: 10px;
- display: block; }
- .akko-ui-container-list-item span {
- display: inline-block;
- text-align: right;
- opacity: 0.5;
- width: 20px; }
- .akko-ui-container-list-item.active {
- color: #c75e58 !important; }
- .akko-ui-visualisers {
- float: right; }
- .akko-ui-add-tracks {
- line-height: 1.4rem;
- text-align: center;
- margin-top: 20px; }
- .akko-ui-add-tracks, .akko-ui-add-tracks a {
- color: #ccc !important; }
- .akko-ui-controls {
- background-color: rgba(255, 255, 255, 0.05);
- height: 60px;
- position: absolute;
- width: 100%;
- bottom: 0;
- left: 0; }
- .akko-ui-controls-play {
- background-color: rgba(255, 255, 255, 0.05);
- line-height: 60px;
- height: 60px;
- width: 60px;
- text-decoration: none;
- display: inline-block;
- text-align: center;
- font-size: 24px;
- color: #fff; }
- .akko-ui-controls-play.active {
- background-color: #c75e58; }
- .akko-ui-controls-play.active:hover {
- background-color: rgba(199, 94, 88, 0.8); }
- .akko-ui-controls-play:hover {
- background-color: rgba(199, 94, 88, 0.2); }
+ transition: opacity 200ms ease-in-out;
+}
+.akko-ui:hover {
+ opacity: 1;
+}
+.akko-ui-container {
+ background-color: rgba(255, 255, 255, 0.05);
+ display: inline-block;
+ position: relative;
+ font-size: 1rem;
+ padding: 10px;
+ color: #fff;
+}
+.akko-ui-container-title {
+ background: rgba(255, 255, 255, 0.05);
+ text-align: center;
+ padding: 5px 10px;
+}
+.akko-ui-container-list-item {
+ color: #fff !important;
+ text-decoration: none;
+ margin-top: 10px;
+ display: block;
+}
+.akko-ui-container-list-item span {
+ display: inline-block;
+ text-align: right;
+ opacity: 0.5;
+ width: 20px;
+}
+.akko-ui-container-list-item.active {
+ color: #c75e58 !important;
+}
+.akko-ui-visualisers {
+ float: right;
+}
+.akko-ui-add-tracks {
+ line-height: 1.4rem;
+ text-align: center;
+ margin-top: 20px;
+}
+.akko-ui-add-tracks, .akko-ui-add-tracks a {
+ color: #ccc !important;
+}
+.akko-ui-controls {
+ background-color: rgba(255, 255, 255, 0.05);
+ height: 60px;
+ position: absolute;
+ width: 100%;
+ bottom: 0;
+ left: 0;
+}
+.akko-ui-controls-play {
+ background-color: rgba(255, 255, 255, 0.05);
+ line-height: 60px;
+ height: 60px;
+ width: 60px;
+ text-decoration: none;
+ display: inline-block;
+ text-align: center;
+ font-size: 24px;
+ color: #fff;
+}
+.akko-ui-controls-play.active {
+ background-color: #c75e58;
+}
+.akko-ui-controls-play.active:hover {
+ background-color: rgba(199, 94, 88, 0.8);
+}
+.akko-ui-controls-play:hover {
+ background-color: rgba(199, 94, 88, 0.2);
+}
diff --git a/dist/akko.js b/dist/akko.js
index 6a9ccbe..ac1a84b 100644
--- a/dist/akko.js
+++ b/dist/akko.js
@@ -1,3206 +1,274 @@
-/*! Akko v0.1.0 | (c) Timur Kuzhagaliyev | github.com/TimboKZ/Akko */
-var Akko =
-/******/ (function(modules) { // webpackBootstrap
-/******/ // The module cache
-/******/ var installedModules = {};
-/******/
-/******/ // The require function
-/******/ function __webpack_require__(moduleId) {
-/******/
-/******/ // Check if module is in cache
-/******/ if(installedModules[moduleId]) {
-/******/ return installedModules[moduleId].exports;
-/******/ }
-/******/ // Create a new module (and put it into the cache)
-/******/ var module = installedModules[moduleId] = {
-/******/ i: moduleId,
-/******/ l: false,
-/******/ exports: {}
-/******/ };
-/******/
-/******/ // Execute the module function
-/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ // Flag the module as loaded
-/******/ module.l = true;
-/******/
-/******/ // Return the exports of the module
-/******/ return module.exports;
-/******/ }
-/******/
-/******/
-/******/ // expose the modules object (__webpack_modules__)
-/******/ __webpack_require__.m = modules;
-/******/
-/******/ // expose the module cache
-/******/ __webpack_require__.c = installedModules;
-/******/
-/******/ // define getter function for harmony exports
-/******/ __webpack_require__.d = function(exports, name, getter) {
-/******/ if(!__webpack_require__.o(exports, name)) {
-/******/ Object.defineProperty(exports, name, {
-/******/ configurable: false,
-/******/ enumerable: true,
-/******/ get: getter
-/******/ });
-/******/ }
-/******/ };
-/******/
-/******/ // getDefaultExport function for compatibility with non-harmony modules
-/******/ __webpack_require__.n = function(module) {
-/******/ var getter = module && module.__esModule ?
-/******/ function getDefault() { return module['default']; } :
-/******/ function getModuleExports() { return module; };
-/******/ __webpack_require__.d(getter, 'a', getter);
-/******/ return getter;
-/******/ };
-/******/
-/******/ // Object.prototype.hasOwnProperty.call
-/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ // __webpack_public_path__
-/******/ __webpack_require__.p = "";
-/******/
-/******/ // Load entry module and return exports
-/******/ return __webpack_require__(__webpack_require__.s = 5);
-/******/ })
-/************************************************************************/
-/******/ ([
-/* 0 */
-/***/ (function(module, exports) {
-
-module.exports = THREE;
+/*! Akko v0.1.1 | (c) Timur Kuzhagaliyev | github.com/TimboKZ/Akko */
+/*
+ * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
+ * This devtool is neither made for production nor for readable output files.
+ * It uses "eval()" calls to create a separate source file in the browser devtools.
+ * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
+ * or disable the default devtool with "devtool: false".
+ * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
+ */
+var Akko;
+/******/ (() => { // webpackBootstrap
+/******/ var __webpack_modules__ = ({
+
+/***/ "./index.js":
+/*!******************!*\
+ !*** ./index.js ***!
+ \******************/
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
+
+eval("{/**\n * @author Timur Kuzhagaliyev \n * @copyright 2017\n * @license GPL-3.0\n */\n\nvar Akko = __webpack_require__(/*! ./lib/Akko */ \"./lib/Akko.js\");\nvar Visualiser = __webpack_require__(/*! ./lib/Visualiser */ \"./lib/Visualiser.js\");\nvar Visualisers = __webpack_require__(/*! ./lib/visualisers */ \"./lib/visualisers/index.js\");\nmodule.exports = Akko;\nmodule.exports.Visualiser = Visualiser;\nmodule.exports.visualisers = Visualisers;\n\n//# sourceURL=webpack://Akko/./index.js?\n}");
/***/ }),
-/* 1 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
-
-/**
- * @author Timur Kuzhagaliyev
- * @copyright 2017
- * @license GPL-3.0
- */
-
-var Helper = __webpack_require__(15);
-
-/**
- * @abstract
- */
-
-var Visualiser = function (_Helper) {
- _inherits(Visualiser, _Helper);
-
- /**
- * @param {object} data
- * @param {string} data.code
- * @param {string} data.name
- * @param {int} data.fftSize
- * @param {number} data.smoothingTimeConstant
- */
- function Visualiser(data) {
- _classCallCheck(this, Visualiser);
-
- var _this = _possibleConstructorReturn(this, (Visualiser.__proto__ || Object.getPrototypeOf(Visualiser)).call(this));
- _this.code = data.code || 'UV';
- _this.name = data.name || 'Untitled Visualiser';
- _this.fftSize = data.fftSize || 128;
- _this.smoothingTimeConstant = data.smoothingTimeConstant || 0;
- _this.initialised = false;
- _this.paused = false;
- return _this;
- }
+/***/ "./lib/Akko.js":
+/*!*********************!*\
+ !*** ./lib/Akko.js ***!
+ \*********************/
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
- /**
- * @param {object} data
- * @param {THREE.WebGLRenderer} data.renderer
- * @param {AnalyserNode} data.analyser
- * @param {number} data.height
- * @param {number} data.width
- */
-
-
- _createClass(Visualiser, [{
- key: 'init',
- value: function init(data) {
- this.onInit(data);
- this.initialised = true;
- }
-
- /**
- * @abstract
- * @param {object} data
- * @param {THREE.WebGLRenderer} data.renderer
- * @param {AnalyserNode} data.analyser
- * @param {number} data.height
- * @param {number} data.width
- */
- // eslint-disable-next-line
-
- }, {
- key: 'onInit',
- value: function onInit(data) {
- throw new Error('The \'onInit\' method was not defined on ' + this.name + '!');
- }
-
- /**
- * @param {object} data
- * @param {THREE.WebGLRenderer} data.renderer
- * @param {AnalyserNode} data.analyser
- * @param {number} data.height
- * @param {number} data.width
- */
-
- }, {
- key: 'revive',
- value: function revive(data) {
- this.onRevive(data);
- this.paused = false;
- }
-
- /**
- * @abstract
- * @param {object} data
- * @param {THREE.WebGLRenderer} data.renderer
- * @param {AnalyserNode} data.analyser
- * @param {number} data.height
- * @param {number} data.width
- */
- // eslint-disable-next-line
-
- }, {
- key: 'onRevive',
- value: function onRevive(data) {}
-
- /**
- * @param {object} data
- * @param {THREE.WebGLRenderer} data.renderer
- * @param {AnalyserNode} data.analyser
- * @param {Float32Array} data.frequencyData
- * @param {Float32Array} data.timeDomainData
- */
-
- }, {
- key: 'update',
- value: function update(data) {
- this.onUpdate(data);
- }
-
- /**
- * @abstract
- * @param {object} data
- * @param {THREE.WebGLRenderer} data.renderer
- * @param {AnalyserNode} data.analyser
- * @param {Float32Array} data.frequencyData
- * @param {Float32Array} data.timeDomainData
- */
- // eslint-disable-next-line
-
- }, {
- key: 'onUpdate',
- value: function onUpdate(data) {
- throw new Error('The \'onUpdate\' method was not defined on ' + this.name + '!');
- }
-
- /**
- * @param {THREE.WebGLRenderer} data.renderer
- * @param {AnalyserNode} data.analyser
- * @param {number} data.height
- * @param {number} data.width
- */
-
- }, {
- key: 'resize',
- value: function resize(data) {
- this.onResize(data);
- }
-
- /**
- * @abstract
- * @param {THREE.WebGLRenderer} data.renderer
- * @param {AnalyserNode} data.analyser
- * @param {number} data.height
- * @param {number} data.width
- */
- // eslint-disable-next-line
-
- }, {
- key: 'onResize',
- value: function onResize(data) {}
- }, {
- key: 'pause',
- value: function pause() {
- this.onPause();
- this.paused = true;
- }
-
- /**
- * @abstract
- */
-
- }, {
- key: 'onPause',
- value: function onPause() {}
- }, {
- key: 'destroy',
- value: function destroy() {
- this.onDestroy();
- }
-
- /**
- * @abstract
- */
-
- }, {
- key: 'onDestroy',
- value: function onDestroy() {
- throw new Error('The \'onDestroy\' method was not defined on ' + this.name + '!');
- }
- }, {
- key: 'error',
- value: function error(message) {
- // TODO: Draw error message on canvas
- throw new Error(message);
- }
- }, {
- key: 'isInitialised',
- value: function isInitialised() {
- return this.initialised;
- }
- }, {
- key: 'isPaused',
- value: function isPaused() {
- return this.paused;
- }
- }]);
-
- return Visualiser;
-}(Helper);
-
-module.exports = Visualiser;
+eval("{function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n/**\n * @author Timur Kuzhagaliyev \n * @copyright 2017\n * @license GPL-3.0\n */\n\nvar THREE = __webpack_require__(/*! three */ \"three\");\nvar MusicPlayer = __webpack_require__(/*! ./MusicPlayer */ \"./lib/MusicPlayer.js\");\nvar VisualisationCore = __webpack_require__(/*! ./VisualisationCore */ \"./lib/VisualisationCore.js\");\nvar UI = __webpack_require__(/*! ./UI.jsx */ \"./lib/UI.jsx\");\n\n/**\n * @type {{containerId: string, useDefaultVisualisers: boolean, autoPlay: boolean}}\n */\nvar defaultOptions = {\n containerId: 'akko',\n useDefaultVisualisers: true,\n autoPlay: false\n};\n\n/**\n * @return {{containerId: string, useDefaultVisualisers: boolean, autoPlay: boolean}}\n */\nvar mergeOptions = function mergeOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var result = {};\n for (var key in defaultOptions) {\n if (!defaultOptions.hasOwnProperty(key)) continue;\n result[key] = options[key] !== undefined ? options[key] : defaultOptions[key];\n }\n return result;\n};\nvar Akko = /*#__PURE__*/function () {\n function Akko(options) {\n _classCallCheck(this, Akko);\n if (!THREE) throw new Error('Akko could not find three.js (`THREE`)!');\n if (!window) throw new Error('Akko could not find `window` variable! Are you running Akko in browser?');\n if (!document) throw new Error('Akko could not find `document` variable! Are you running Akko in browser?');\n this.AudioContext = window.AudioContext || window.webkitAudioContext;\n if (!this.AudioContext) throw new Error('Akko could not find `AudioContext`! Is it supported in your browser?');\n this.options = mergeOptions(options);\n this.container = document.getElementById(this.options.containerId);\n if (!this.container) throw new Error(\"Could not find element with ID '\".concat(this.options.containerId, \"'!\"));\n this.musicPlayer = new MusicPlayer({\n audioContext: new this.AudioContext(),\n autoPlay: options.autoPlay\n });\n this.visCore = new VisualisationCore({\n parentElement: this.container,\n useDefaultVisualisers: this.options.useDefaultVisualisers,\n analyser: this.musicPlayer.getAnalyser()\n });\n }\n return _createClass(Akko, [{\n key: \"start\",\n value: function start() {\n this.bootstrapUI();\n this.visCore.prepare();\n this.visCore.useVisualiser(0);\n this.musicPlayer.start();\n this.visCore.start();\n this.setupListeners();\n }\n }, {\n key: \"bootstrapUI\",\n value: function bootstrapUI() {\n this.ui = new UI({\n container: this.container,\n musicPlayer: this.musicPlayer,\n visCore: this.visCore\n });\n this.ui.start();\n }\n\n /**\n * @param {Visualiser} visualiser\n */\n }, {\n key: \"addVisualiser\",\n value: function addVisualiser(visualiser) {\n this.visCore.addVisualiser(visualiser);\n }\n\n /**\n * @param {string|File|ArrayBuffer} source\n * @param {string} [title]\n */\n }, {\n key: \"addTrack\",\n value: function addTrack(source, title) {\n this.musicPlayer.addTrack(source, title);\n }\n\n /**\n * @private\n */\n }, {\n key: \"setupListeners\",\n value: function setupListeners() {\n if (window.File && window.FileReader && window.FileList && window.Blob) {\n this.container.addEventListener('dragover', this.onDragOver.bind(this), false);\n this.container.addEventListener('drop', this.onDrop.bind(this), false);\n } else {\n console.warn('The File APIs are not fully supported your browser. Drag & drop disabled in Akko.');\n }\n }\n\n /**\n * @private\n */\n }, {\n key: \"onDragOver\",\n value: function onDragOver(event) {\n event.stopPropagation();\n event.preventDefault();\n event.dataTransfer.dropEffect = 'copy';\n }\n\n /**\n * @private\n */\n }, {\n key: \"onDrop\",\n value: function onDrop(event) {\n event.stopPropagation();\n event.preventDefault();\n var files = event.dataTransfer.files;\n for (var i = 0; i < files.length; i++) {\n var file = files[i];\n if (file.type.match(/audio.*/)) {\n this.musicPlayer.addTrack(file);\n }\n }\n }\n }]);\n}();\nmodule.exports = Akko;\n\n//# sourceURL=webpack://Akko/./lib/Akko.js?\n}");
/***/ }),
-/* 2 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-/**
- * @author Timur Kuzhagaliyev
- * @copyright 2017
- * @license GPL-3.0
- */
-
-var Promise = __webpack_require__(10);
-var Track = __webpack_require__(11);
-
-var PlayerStates = {
- LOADING: 'Loading...',
- READY: 'Ready!',
- PLAYING: 'Playing...',
- PAUSED: 'Paused.',
- FINISHED: 'Finished!'
-};
-var MusicPlayer = function () {
+/***/ "./lib/Helper.js":
+/*!***********************!*\
+ !*** ./lib/Helper.js ***!
+ \***********************/
+/***/ ((module) => {
- /**
- * @param data
- * @param {AudioContext} data.audioContext
- * @param {boolean} data.autoPlay
- */
- function MusicPlayer(data) {
- _classCallCheck(this, MusicPlayer);
-
- this.context = data.audioContext;
- this.autoPlay = data.autoPlay;
- this.gain = this.context.createGain();
- this.gain.connect(this.context.destination);
- this.analyser = this.context.createAnalyser();
- this.analyser.connect(this.context.destination);
-
- this.buffer = null;
- this.sourceNode = this.context.createBufferSource();
- this.startedAt = 0;
- this.pausedAt = 0;
- this.playing = false;
-
- /**
- * @callback playbackListener
- * @param {string} playerState
- * @param {Track[]} trackList
- * @param {int} currentTrackIndex
- */
- /** @type {playbackListener[]} */
- this.listeners = [];
-
- /** @type {Track[]} */
- this.trackList = [];
- this.currentTrackIndex = -1;
-
- this.setState(PlayerStates.READY);
- }
-
- _createClass(MusicPlayer, [{
- key: 'setState',
- value: function setState(newState) {
- this.state = newState;
- this.notifyListeners();
- }
- }, {
- key: 'notifyListeners',
- value: function notifyListeners() {
- for (var i = 0; i < this.listeners.length; i++) {
- var listener = this.listeners[i];
- listener(this.state, this.trackList, this.currentTrackIndex);
- }
- }
-
- /**
- * @param {playbackListener} listener
- */
-
- }, {
- key: 'addListener',
- value: function addListener(listener) {
- this.listeners.push(listener);
- }
- }, {
- key: 'start',
- value: function start() {
- this.setState(PlayerStates.READY);
- if (this.autoPlay) this.playNextTrack();
- this.started = true;
- }
-
- /**
- * @param {int} [currentTrackIndex] Current track index override
- */
-
- }, {
- key: 'playNextTrack',
- value: function playNextTrack(currentTrackIndex) {
- var currentIndex = currentTrackIndex || this.currentTrackIndex;
- var nextTrackIndex = currentIndex + 1;
- if (nextTrackIndex >= this.trackList.length) {
- return this.setState(PlayerStates.FINISHED);
- }
- this.playTrack(nextTrackIndex);
- }
- }, {
- key: 'playTrack',
- value: function playTrack(index) {
- var _this = this;
-
- this.setState(PlayerStates.LOADING);
- var track = this.trackList[index];
- Promise.resolve().then(function () {
- return track.prepareArrayBuffer();
- }).then(function (arrayBuffer) {
- return _this.context.decodeAudioData(arrayBuffer);
- }).then(function (audioBuffer) {
- _this.buffer = audioBuffer;
- _this.stop();
- _this.play();
- _this.currentTrackIndex = index;
- _this.setState(PlayerStates.PLAYING);
- }).catch(function (error) {
- console.error('Error preparing track:', error);
- console.warn('Skipping \'' + track.title + '\'!');
- return _this.playNextTrack(index);
- });
- }
- }, {
- key: 'togglePlayback',
- value: function togglePlayback() {
- if (this.playing) {
- this.pause();
- } else {
- if (this.buffer === null) this.playNextTrack();else this.play();
- }
- return this.playing;
- }
- }, {
- key: 'play',
- value: function play() {
- var offset = this.pausedAt;
- this.sourceNode = this.context.createBufferSource();
- this.sourceNode.connect(this.gain);
- this.sourceNode.connect(this.analyser);
- this.sourceNode.buffer = this.buffer;
- this.sourceNode.onended = this.ended.bind(this);
- this.sourceNode.start(0, offset);
- this.startedAt = this.context.currentTime - offset;
- this.pausedAt = 0;
- this.playing = true;
- this.setState(PlayerStates.PLAYING);
- }
- }, {
- key: 'pause',
- value: function pause() {
- if (!this.playing) return;
- var elapsed = this.context.currentTime - this.startedAt;
- this.stop();
- this.pausedAt = elapsed;
- this.setState(PlayerStates.PAUSED);
- }
- }, {
- key: 'stop',
- value: function stop() {
- if (!this.playing) return;
- if (this.sourceNode) {
- this.sourceNode.disconnect();
- this.sourceNode.stop(0);
- this.sourceNode = null;
- }
- this.pausedAt = 0;
- this.startedAt = 0;
- this.playing = false;
- }
- }, {
- key: 'ended',
- value: function ended() {
- this.playNextTrack();
- }
- }, {
- key: 'addTrack',
- value: function addTrack(source, title) {
- var track = new Track({
- source: source,
- title: title
- });
- var length = this.trackList.push(track);
- this.notifyListeners();
- if (this.started) this.playTrack(length - 1);
- }
- }, {
- key: 'getAnalyser',
- value: function getAnalyser() {
- return this.analyser;
- }
- }]);
-
- return MusicPlayer;
-}();
-
-module.exports = MusicPlayer;
-module.exports.States = PlayerStates;
+eval("{function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n/**\n * @author Timur Kuzhagaliyev \n * @copyright 2017\n * @license GPL-3.0\n */\nvar Helper = /*#__PURE__*/function () {\n function Helper() {\n _classCallCheck(this, Helper);\n }\n return _createClass(Helper, [{\n key: \"lerp\",\n value: function lerp(current, target, fraction) {\n if (isNaN(target) || target === Infinity || target === -Infinity) return current;\n return current + (target - current) * fraction;\n }\n }, {\n key: \"constrain\",\n value: function constrain(max, min, value) {\n return Math.min(max, Math.max(min, value));\n }\n }]);\n}();\nmodule.exports = Helper;\n\n//# sourceURL=webpack://Akko/./lib/Helper.js?\n}");
/***/ }),
-/* 3 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
+/***/ "./lib/MusicPlayer.js":
+/*!****************************!*\
+ !*** ./lib/MusicPlayer.js ***!
+ \****************************/
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
-/**
- * @author Timur Kuzhagaliyev
- * @copyright 2017
- * @license GPL-3.0
- */
-
-module.exports = {
- BarVisualiser: __webpack_require__(14),
- RingVisualiser: __webpack_require__(16)
-};
+eval("{function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n/**\n * @author Timur Kuzhagaliyev \n * @copyright 2017\n * @license GPL-3.0\n */\n\nvar Promise = __webpack_require__(/*! bluebird */ \"bluebird\");\nvar Track = __webpack_require__(/*! ./Track */ \"./lib/Track.js\");\nvar PlayerStates = {\n LOADING: 'Loading...',\n READY: 'Ready!',\n PLAYING: 'Playing...',\n PAUSED: 'Paused.',\n FINISHED: 'Finished!'\n};\nvar MusicPlayer = /*#__PURE__*/function () {\n /**\n * @param data\n * @param {AudioContext} data.audioContext\n * @param {boolean} data.autoPlay\n */\n function MusicPlayer(data) {\n _classCallCheck(this, MusicPlayer);\n this.context = data.audioContext;\n this.autoPlay = data.autoPlay;\n this.gain = this.context.createGain();\n this.gain.connect(this.context.destination);\n this.analyser = this.context.createAnalyser();\n this.analyser.connect(this.context.destination);\n this.buffer = null;\n this.sourceNode = this.context.createBufferSource();\n this.startedAt = 0;\n this.pausedAt = 0;\n this.playing = false;\n\n /**\n * @callback playbackListener\n * @param {string} playerState\n * @param {Track[]} trackList\n * @param {int} currentTrackIndex\n */\n /** @type {playbackListener[]} */\n this.listeners = [];\n\n /** @type {Track[]} */\n this.trackList = [];\n this.currentTrackIndex = -1;\n this.setState(PlayerStates.READY);\n }\n return _createClass(MusicPlayer, [{\n key: \"setState\",\n value: function setState(newState) {\n this.state = newState;\n this.notifyListeners();\n }\n }, {\n key: \"notifyListeners\",\n value: function notifyListeners() {\n for (var i = 0; i < this.listeners.length; i++) {\n var listener = this.listeners[i];\n listener(this.state, this.trackList, this.currentTrackIndex);\n }\n }\n\n /**\n * @param {playbackListener} listener\n */\n }, {\n key: \"addListener\",\n value: function addListener(listener) {\n this.listeners.push(listener);\n }\n }, {\n key: \"start\",\n value: function start() {\n this.setState(PlayerStates.READY);\n if (this.autoPlay) this.playNextTrack();\n this.started = true;\n }\n\n /**\n * @param {int} [currentTrackIndex] Current track index override\n */\n }, {\n key: \"playNextTrack\",\n value: function playNextTrack(currentTrackIndex) {\n var currentIndex = currentTrackIndex || this.currentTrackIndex;\n var nextTrackIndex = currentIndex + 1;\n if (nextTrackIndex >= this.trackList.length) {\n return this.setState(PlayerStates.FINISHED);\n }\n this.playTrack(nextTrackIndex);\n }\n }, {\n key: \"playTrack\",\n value: function playTrack(index) {\n var _this = this;\n this.setState(PlayerStates.LOADING);\n var track = this.trackList[index];\n Promise.resolve().then(function () {\n return track.prepareArrayBuffer();\n }).then(function (arrayBuffer) {\n // Clone the array buffer to prevent detachment\n var clonedBuffer = arrayBuffer.slice(0);\n\n // Use promise-based decodeAudioData with proper error handling\n return new Promise(function (resolve, reject) {\n _this.context.decodeAudioData(clonedBuffer, resolve, reject);\n });\n }).then(function (audioBuffer) {\n _this.buffer = audioBuffer;\n _this.stop();\n _this.play();\n _this.currentTrackIndex = index;\n _this.setState(PlayerStates.PLAYING);\n })[\"catch\"](function (error) {\n console.error('Error preparing track:', error);\n console.warn(\"Skipping '\".concat(track.title, \"'!\"));\n return _this.playNextTrack(index);\n });\n }\n }, {\n key: \"togglePlayback\",\n value: function togglePlayback() {\n if (this.playing) {\n this.pause();\n } else {\n if (this.buffer === null) this.playNextTrack();else this.play();\n }\n return this.playing;\n }\n }, {\n key: \"play\",\n value: function play() {\n var offset = this.pausedAt;\n this.sourceNode = this.context.createBufferSource();\n this.sourceNode.connect(this.gain);\n this.sourceNode.connect(this.analyser);\n this.sourceNode.buffer = this.buffer;\n this.sourceNode.onended = this.ended.bind(this);\n this.sourceNode.start(0, offset);\n this.startedAt = this.context.currentTime - offset;\n this.pausedAt = 0;\n this.playing = true;\n this.setState(PlayerStates.PLAYING);\n }\n }, {\n key: \"pause\",\n value: function pause() {\n if (!this.playing) return;\n var elapsed = this.context.currentTime - this.startedAt;\n this.stop();\n this.pausedAt = elapsed;\n this.setState(PlayerStates.PAUSED);\n }\n }, {\n key: \"stop\",\n value: function stop() {\n if (!this.playing) return;\n if (this.sourceNode) {\n this.sourceNode.disconnect();\n this.sourceNode.stop(0);\n this.sourceNode = null;\n }\n this.pausedAt = 0;\n this.startedAt = 0;\n this.playing = false;\n }\n }, {\n key: \"ended\",\n value: function ended() {\n this.playNextTrack();\n }\n }, {\n key: \"addTrack\",\n value: function addTrack(source, title) {\n var track = new Track({\n source: source,\n title: title\n });\n var length = this.trackList.push(track);\n this.notifyListeners();\n if (this.started) this.playTrack(length - 1);\n }\n }, {\n key: \"getAnalyser\",\n value: function getAnalyser() {\n return this.analyser;\n }\n }]);\n}();\nmodule.exports = MusicPlayer;\nmodule.exports.States = PlayerStates;\n\n//# sourceURL=webpack://Akko/./lib/MusicPlayer.js?\n}");
/***/ }),
-/* 4 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return h; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createElement", function() { return h; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cloneElement", function() { return cloneElement; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Component", function() { return Component; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "render", function() { return render; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rerender", function() { return rerender; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "options", function() { return options; });
-/** Virtual DOM Node */
-function VNode() {}
-
-/** Global options
- * @public
- * @namespace options {Object}
- */
-var options = {
-
- /** If `true`, `prop` changes trigger synchronous component updates.
- * @name syncComponentUpdates
- * @type Boolean
- * @default true
- */
- //syncComponentUpdates: true,
-
- /** Processes all created VNodes.
- * @param {VNode} vnode A newly-created VNode to normalize/process
- */
- //vnode(vnode) { }
-
- /** Hook invoked after a component is mounted. */
- // afterMount(component) { }
-
- /** Hook invoked after the DOM is updated with a component's latest render. */
- // afterUpdate(component) { }
-
- /** Hook invoked immediately before a component is unmounted. */
- // beforeUnmount(component) { }
-};
-
-var stack = [];
-
-var EMPTY_CHILDREN = [];
-
-/** JSX/hyperscript reviver
-* Benchmarks: https://esbench.com/bench/57ee8f8e330ab09900a1a1a0
- * @see http://jasonformat.com/wtf-is-jsx
- * @public
- */
-function h(nodeName, attributes) {
- var children = EMPTY_CHILDREN,
- lastSimple,
- child,
- simple,
- i;
- for (i = arguments.length; i-- > 2;) {
- stack.push(arguments[i]);
- }
- if (attributes && attributes.children != null) {
- if (!stack.length) stack.push(attributes.children);
- delete attributes.children;
- }
- while (stack.length) {
- if ((child = stack.pop()) && child.pop !== undefined) {
- for (i = child.length; i--;) {
- stack.push(child[i]);
- }
- } else {
- if (typeof child === 'boolean') child = null;
-
- if (simple = typeof nodeName !== 'function') {
- if (child == null) child = '';else if (typeof child === 'number') child = String(child);else if (typeof child !== 'string') simple = false;
- }
-
- if (simple && lastSimple) {
- children[children.length - 1] += child;
- } else if (children === EMPTY_CHILDREN) {
- children = [child];
- } else {
- children.push(child);
- }
-
- lastSimple = simple;
- }
- }
-
- var p = new VNode();
- p.nodeName = nodeName;
- p.children = children;
- p.attributes = attributes == null ? undefined : attributes;
- p.key = attributes == null ? undefined : attributes.key;
-
- // if a "vnode hook" is defined, pass every created VNode to it
- if (options.vnode !== undefined) options.vnode(p);
-
- return p;
-}
-
-/** Copy own-properties from `props` onto `obj`.
- * @returns obj
- * @private
- */
-function extend(obj, props) {
- for (var i in props) {
- obj[i] = props[i];
- }return obj;
-}
-
-/** Call a function asynchronously, as soon as possible.
- * @param {Function} callback
- */
-var defer = typeof Promise == 'function' ? Promise.resolve().then.bind(Promise.resolve()) : setTimeout;
-
-function cloneElement(vnode, props) {
- return h(vnode.nodeName, extend(extend({}, vnode.attributes), props), arguments.length > 2 ? [].slice.call(arguments, 2) : vnode.children);
-}
-
-// DOM properties that should NOT have "px" added when numeric
-var IS_NON_DIMENSIONAL = /acit|ex(?:s|g|n|p|$)|rph|ows|mnc|ntw|ine[ch]|zoo|^ord/i;
-
-/** Managed queue of dirty components to be re-rendered */
-
-var items = [];
-
-function enqueueRender(component) {
- if (!component._dirty && (component._dirty = true) && items.push(component) == 1) {
- (options.debounceRendering || defer)(rerender);
- }
-}
-
-function rerender() {
- var p,
- list = items;
- items = [];
- while (p = list.pop()) {
- if (p._dirty) renderComponent(p);
- }
-}
-
-/** Check if two nodes are equivalent.
- * @param {Element} node
- * @param {VNode} vnode
- * @private
- */
-function isSameNodeType(node, vnode, hydrating) {
- if (typeof vnode === 'string' || typeof vnode === 'number') {
- return node.splitText !== undefined;
- }
- if (typeof vnode.nodeName === 'string') {
- return !node._componentConstructor && isNamedNode(node, vnode.nodeName);
- }
- return hydrating || node._componentConstructor === vnode.nodeName;
-}
-
-/** Check if an Element has a given normalized name.
-* @param {Element} node
-* @param {String} nodeName
- */
-function isNamedNode(node, nodeName) {
- return node.normalizedNodeName === nodeName || node.nodeName.toLowerCase() === nodeName.toLowerCase();
-}
-
-/**
- * Reconstruct Component-style `props` from a VNode.
- * Ensures default/fallback values from `defaultProps`:
- * Own-properties of `defaultProps` not present in `vnode.attributes` are added.
- * @param {VNode} vnode
- * @returns {Object} props
- */
-function getNodeProps(vnode) {
- var props = extend({}, vnode.attributes);
- props.children = vnode.children;
-
- var defaultProps = vnode.nodeName.defaultProps;
- if (defaultProps !== undefined) {
- for (var i in defaultProps) {
- if (props[i] === undefined) {
- props[i] = defaultProps[i];
- }
- }
- }
-
- return props;
-}
-
-/** Create an element with the given nodeName.
- * @param {String} nodeName
- * @param {Boolean} [isSvg=false] If `true`, creates an element within the SVG namespace.
- * @returns {Element} node
- */
-function createNode(nodeName, isSvg) {
- var node = isSvg ? document.createElementNS('http://www.w3.org/2000/svg', nodeName) : document.createElement(nodeName);
- node.normalizedNodeName = nodeName;
- return node;
-}
-
-/** Remove a child node from its parent if attached.
- * @param {Element} node The node to remove
- */
-function removeNode(node) {
- var parentNode = node.parentNode;
- if (parentNode) parentNode.removeChild(node);
-}
-
-/** Set a named attribute on the given Node, with special behavior for some names and event handlers.
- * If `value` is `null`, the attribute/handler will be removed.
- * @param {Element} node An element to mutate
- * @param {string} name The name/key to set, such as an event or attribute name
- * @param {any} old The last value that was set for this name/node pair
- * @param {any} value An attribute value, such as a function to be used as an event handler
- * @param {Boolean} isSvg Are we currently diffing inside an svg?
- * @private
- */
-function setAccessor(node, name, old, value, isSvg) {
- if (name === 'className') name = 'class';
-
- if (name === 'key') {
- // ignore
- } else if (name === 'ref') {
- if (old) old(null);
- if (value) value(node);
- } else if (name === 'class' && !isSvg) {
- node.className = value || '';
- } else if (name === 'style') {
- if (!value || typeof value === 'string' || typeof old === 'string') {
- node.style.cssText = value || '';
- }
- if (value && typeof value === 'object') {
- if (typeof old !== 'string') {
- for (var i in old) {
- if (!(i in value)) node.style[i] = '';
- }
- }
- for (var i in value) {
- node.style[i] = typeof value[i] === 'number' && IS_NON_DIMENSIONAL.test(i) === false ? value[i] + 'px' : value[i];
- }
- }
- } else if (name === 'dangerouslySetInnerHTML') {
- if (value) node.innerHTML = value.__html || '';
- } else if (name[0] == 'o' && name[1] == 'n') {
- var useCapture = name !== (name = name.replace(/Capture$/, ''));
- name = name.toLowerCase().substring(2);
- if (value) {
- if (!old) node.addEventListener(name, eventProxy, useCapture);
- } else {
- node.removeEventListener(name, eventProxy, useCapture);
- }
- (node._listeners || (node._listeners = {}))[name] = value;
- } else if (name !== 'list' && name !== 'type' && !isSvg && name in node) {
- setProperty(node, name, value == null ? '' : value);
- if (value == null || value === false) node.removeAttribute(name);
- } else {
- var ns = isSvg && name !== (name = name.replace(/^xlink\:?/, ''));
- if (value == null || value === false) {
- if (ns) node.removeAttributeNS('http://www.w3.org/1999/xlink', name.toLowerCase());else node.removeAttribute(name);
- } else if (typeof value !== 'function') {
- if (ns) node.setAttributeNS('http://www.w3.org/1999/xlink', name.toLowerCase(), value);else node.setAttribute(name, value);
- }
- }
-}
-
-/** Attempt to set a DOM property to the given value.
- * IE & FF throw for certain property-value combinations.
- */
-function setProperty(node, name, value) {
- try {
- node[name] = value;
- } catch (e) {}
-}
-
-/** Proxy an event to hooked event handlers
- * @private
- */
-function eventProxy(e) {
- return this._listeners[e.type](options.event && options.event(e) || e);
-}
-
-/** Queue of components that have been mounted and are awaiting componentDidMount */
-var mounts = [];
-
-/** Diff recursion count, used to track the end of the diff cycle. */
-var diffLevel = 0;
-
-/** Global flag indicating if the diff is currently within an SVG */
-var isSvgMode = false;
-
-/** Global flag indicating if the diff is performing hydration */
-var hydrating = false;
-
-/** Invoke queued componentDidMount lifecycle methods */
-function flushMounts() {
- var c;
- while (c = mounts.pop()) {
- if (options.afterMount) options.afterMount(c);
- if (c.componentDidMount) c.componentDidMount();
- }
-}
-
-/** Apply differences in a given vnode (and it's deep children) to a real DOM Node.
- * @param {Element} [dom=null] A DOM node to mutate into the shape of the `vnode`
- * @param {VNode} vnode A VNode (with descendants forming a tree) representing the desired DOM structure
- * @returns {Element} dom The created/mutated element
- * @private
- */
-function diff(dom, vnode, context, mountAll, parent, componentRoot) {
- // diffLevel having been 0 here indicates initial entry into the diff (not a subdiff)
- if (!diffLevel++) {
- // when first starting the diff, check if we're diffing an SVG or within an SVG
- isSvgMode = parent != null && parent.ownerSVGElement !== undefined;
-
- // hydration is indicated by the existing element to be diffed not having a prop cache
- hydrating = dom != null && !('__preactattr_' in dom);
- }
-
- var ret = idiff(dom, vnode, context, mountAll, componentRoot);
-
- // append the element if its a new parent
- if (parent && ret.parentNode !== parent) parent.appendChild(ret);
-
- // diffLevel being reduced to 0 means we're exiting the diff
- if (! --diffLevel) {
- hydrating = false;
- // invoke queued componentDidMount lifecycle methods
- if (!componentRoot) flushMounts();
- }
-
- return ret;
-}
-
-/** Internals of `diff()`, separated to allow bypassing diffLevel / mount flushing. */
-function idiff(dom, vnode, context, mountAll, componentRoot) {
- var out = dom,
- prevSvgMode = isSvgMode;
-
- // empty values (null, undefined, booleans) render as empty Text nodes
- if (vnode == null || typeof vnode === 'boolean') vnode = '';
-
- // Fast case: Strings & Numbers create/update Text nodes.
- if (typeof vnode === 'string' || typeof vnode === 'number') {
-
- // update if it's already a Text node:
- if (dom && dom.splitText !== undefined && dom.parentNode && (!dom._component || componentRoot)) {
- /* istanbul ignore if */ /* Browser quirk that can't be covered: https://github.com/developit/preact/commit/fd4f21f5c45dfd75151bd27b4c217d8003aa5eb9 */
- if (dom.nodeValue != vnode) {
- dom.nodeValue = vnode;
- }
- } else {
- // it wasn't a Text node: replace it with one and recycle the old Element
- out = document.createTextNode(vnode);
- if (dom) {
- if (dom.parentNode) dom.parentNode.replaceChild(out, dom);
- recollectNodeTree(dom, true);
- }
- }
-
- out['__preactattr_'] = true;
-
- return out;
- }
-
- // If the VNode represents a Component, perform a component diff:
- var vnodeName = vnode.nodeName;
- if (typeof vnodeName === 'function') {
- return buildComponentFromVNode(dom, vnode, context, mountAll);
- }
-
- // Tracks entering and exiting SVG namespace when descending through the tree.
- isSvgMode = vnodeName === 'svg' ? true : vnodeName === 'foreignObject' ? false : isSvgMode;
-
- // If there's no existing element or it's the wrong type, create a new one:
- vnodeName = String(vnodeName);
- if (!dom || !isNamedNode(dom, vnodeName)) {
- out = createNode(vnodeName, isSvgMode);
-
- if (dom) {
- // move children into the replacement node
- while (dom.firstChild) {
- out.appendChild(dom.firstChild);
- } // if the previous Element was mounted into the DOM, replace it inline
- if (dom.parentNode) dom.parentNode.replaceChild(out, dom);
-
- // recycle the old element (skips non-Element node types)
- recollectNodeTree(dom, true);
- }
- }
-
- var fc = out.firstChild,
- props = out['__preactattr_'],
- vchildren = vnode.children;
-
- if (props == null) {
- props = out['__preactattr_'] = {};
- for (var a = out.attributes, i = a.length; i--;) {
- props[a[i].name] = a[i].value;
- }
- }
-
- // Optimization: fast-path for elements containing a single TextNode:
- if (!hydrating && vchildren && vchildren.length === 1 && typeof vchildren[0] === 'string' && fc != null && fc.splitText !== undefined && fc.nextSibling == null) {
- if (fc.nodeValue != vchildren[0]) {
- fc.nodeValue = vchildren[0];
- }
- }
- // otherwise, if there are existing or new children, diff them:
- else if (vchildren && vchildren.length || fc != null) {
- innerDiffNode(out, vchildren, context, mountAll, hydrating || props.dangerouslySetInnerHTML != null);
- }
-
- // Apply attributes/props from VNode to the DOM Element:
- diffAttributes(out, vnode.attributes, props);
-
- // restore previous SVG mode: (in case we're exiting an SVG namespace)
- isSvgMode = prevSvgMode;
-
- return out;
-}
-
-/** Apply child and attribute changes between a VNode and a DOM Node to the DOM.
- * @param {Element} dom Element whose children should be compared & mutated
- * @param {Array} vchildren Array of VNodes to compare to `dom.childNodes`
- * @param {Object} context Implicitly descendant context object (from most recent `getChildContext()`)
- * @param {Boolean} mountAll
- * @param {Boolean} isHydrating If `true`, consumes externally created elements similar to hydration
- */
-function innerDiffNode(dom, vchildren, context, mountAll, isHydrating) {
- var originalChildren = dom.childNodes,
- children = [],
- keyed = {},
- keyedLen = 0,
- min = 0,
- len = originalChildren.length,
- childrenLen = 0,
- vlen = vchildren ? vchildren.length : 0,
- j,
- c,
- f,
- vchild,
- child;
-
- // Build up a map of keyed children and an Array of unkeyed children:
- if (len !== 0) {
- for (var i = 0; i < len; i++) {
- var _child = originalChildren[i],
- props = _child['__preactattr_'],
- key = vlen && props ? _child._component ? _child._component.__key : props.key : null;
- if (key != null) {
- keyedLen++;
- keyed[key] = _child;
- } else if (props || (_child.splitText !== undefined ? isHydrating ? _child.nodeValue.trim() : true : isHydrating)) {
- children[childrenLen++] = _child;
- }
- }
- }
-
- if (vlen !== 0) {
- for (var i = 0; i < vlen; i++) {
- vchild = vchildren[i];
- child = null;
-
- // attempt to find a node based on key matching
- var key = vchild.key;
- if (key != null) {
- if (keyedLen && keyed[key] !== undefined) {
- child = keyed[key];
- keyed[key] = undefined;
- keyedLen--;
- }
- }
- // attempt to pluck a node of the same type from the existing children
- else if (!child && min < childrenLen) {
- for (j = min; j < childrenLen; j++) {
- if (children[j] !== undefined && isSameNodeType(c = children[j], vchild, isHydrating)) {
- child = c;
- children[j] = undefined;
- if (j === childrenLen - 1) childrenLen--;
- if (j === min) min++;
- break;
- }
- }
- }
-
- // morph the matched/found/created DOM child to match vchild (deep)
- child = idiff(child, vchild, context, mountAll);
-
- f = originalChildren[i];
- if (child && child !== dom && child !== f) {
- if (f == null) {
- dom.appendChild(child);
- } else if (child === f.nextSibling) {
- removeNode(f);
- } else {
- dom.insertBefore(child, f);
- }
- }
- }
- }
-
- // remove unused keyed children:
- if (keyedLen) {
- for (var i in keyed) {
- if (keyed[i] !== undefined) recollectNodeTree(keyed[i], false);
- }
- }
-
- // remove orphaned unkeyed children:
- while (min <= childrenLen) {
- if ((child = children[childrenLen--]) !== undefined) recollectNodeTree(child, false);
- }
-}
-
-/** Recursively recycle (or just unmount) a node and its descendants.
- * @param {Node} node DOM node to start unmount/removal from
- * @param {Boolean} [unmountOnly=false] If `true`, only triggers unmount lifecycle, skips removal
- */
-function recollectNodeTree(node, unmountOnly) {
- var component = node._component;
- if (component) {
- // if node is owned by a Component, unmount that component (ends up recursing back here)
- unmountComponent(component);
- } else {
- // If the node's VNode had a ref function, invoke it with null here.
- // (this is part of the React spec, and smart for unsetting references)
- if (node['__preactattr_'] != null && node['__preactattr_'].ref) node['__preactattr_'].ref(null);
-
- if (unmountOnly === false || node['__preactattr_'] == null) {
- removeNode(node);
- }
-
- removeChildren(node);
- }
-}
-
-/** Recollect/unmount all children.
- * - we use .lastChild here because it causes less reflow than .firstChild
- * - it's also cheaper than accessing the .childNodes Live NodeList
- */
-function removeChildren(node) {
- node = node.lastChild;
- while (node) {
- var next = node.previousSibling;
- recollectNodeTree(node, true);
- node = next;
- }
-}
-
-/** Apply differences in attributes from a VNode to the given DOM Element.
- * @param {Element} dom Element with attributes to diff `attrs` against
- * @param {Object} attrs The desired end-state key-value attribute pairs
- * @param {Object} old Current/previous attributes (from previous VNode or element's prop cache)
- */
-function diffAttributes(dom, attrs, old) {
- var name;
-
- // remove attributes no longer present on the vnode by setting them to undefined
- for (name in old) {
- if (!(attrs && attrs[name] != null) && old[name] != null) {
- setAccessor(dom, name, old[name], old[name] = undefined, isSvgMode);
- }
- }
-
- // add new & update changed attributes
- for (name in attrs) {
- if (name !== 'children' && name !== 'innerHTML' && (!(name in old) || attrs[name] !== (name === 'value' || name === 'checked' ? dom[name] : old[name]))) {
- setAccessor(dom, name, old[name], old[name] = attrs[name], isSvgMode);
- }
- }
-}
-
-/** Retains a pool of Components for re-use, keyed on component name.
- * Note: since component names are not unique or even necessarily available, these are primarily a form of sharding.
- * @private
- */
-var components = {};
-
-/** Reclaim a component for later re-use by the recycler. */
-function collectComponent(component) {
- var name = component.constructor.name;
- (components[name] || (components[name] = [])).push(component);
-}
-
-/** Create a component. Normalizes differences between PFC's and classful Components. */
-function createComponent(Ctor, props, context) {
- var list = components[Ctor.name],
- inst;
-
- if (Ctor.prototype && Ctor.prototype.render) {
- inst = new Ctor(props, context);
- Component.call(inst, props, context);
- } else {
- inst = new Component(props, context);
- inst.constructor = Ctor;
- inst.render = doRender;
- }
-
- if (list) {
- for (var i = list.length; i--;) {
- if (list[i].constructor === Ctor) {
- inst.nextBase = list[i].nextBase;
- list.splice(i, 1);
- break;
- }
- }
- }
- return inst;
-}
-
-/** The `.render()` method for a PFC backing instance. */
-function doRender(props, state, context) {
- return this.constructor(props, context);
-}
-
-/** Set a component's `props` (generally derived from JSX attributes).
- * @param {Object} props
- * @param {Object} [opts]
- * @param {boolean} [opts.renderSync=false] If `true` and {@link options.syncComponentUpdates} is `true`, triggers synchronous rendering.
- * @param {boolean} [opts.render=true] If `false`, no render will be triggered.
- */
-function setComponentProps(component, props, opts, context, mountAll) {
- if (component._disable) return;
- component._disable = true;
-
- if (component.__ref = props.ref) delete props.ref;
- if (component.__key = props.key) delete props.key;
-
- if (!component.base || mountAll) {
- if (component.componentWillMount) component.componentWillMount();
- } else if (component.componentWillReceiveProps) {
- component.componentWillReceiveProps(props, context);
- }
-
- if (context && context !== component.context) {
- if (!component.prevContext) component.prevContext = component.context;
- component.context = context;
- }
- if (!component.prevProps) component.prevProps = component.props;
- component.props = props;
-
- component._disable = false;
-
- if (opts !== 0) {
- if (opts === 1 || options.syncComponentUpdates !== false || !component.base) {
- renderComponent(component, 1, mountAll);
- } else {
- enqueueRender(component);
- }
- }
-
- if (component.__ref) component.__ref(component);
-}
-
-/** Render a Component, triggering necessary lifecycle events and taking High-Order Components into account.
- * @param {Component} component
- * @param {Object} [opts]
- * @param {boolean} [opts.build=false] If `true`, component will build and store a DOM node if not already associated with one.
- * @private
- */
-function renderComponent(component, opts, mountAll, isChild) {
- if (component._disable) return;
-
- var props = component.props,
- state = component.state,
- context = component.context,
- previousProps = component.prevProps || props,
- previousState = component.prevState || state,
- previousContext = component.prevContext || context,
- isUpdate = component.base,
- nextBase = component.nextBase,
- initialBase = isUpdate || nextBase,
- initialChildComponent = component._component,
- skip = false,
- rendered,
- inst,
- cbase;
-
- // if updating
- if (isUpdate) {
- component.props = previousProps;
- component.state = previousState;
- component.context = previousContext;
- if (opts !== 2 && component.shouldComponentUpdate && component.shouldComponentUpdate(props, state, context) === false) {
- skip = true;
- } else if (component.componentWillUpdate) {
- component.componentWillUpdate(props, state, context);
- }
- component.props = props;
- component.state = state;
- component.context = context;
- }
-
- component.prevProps = component.prevState = component.prevContext = component.nextBase = null;
- component._dirty = false;
-
- if (!skip) {
- rendered = component.render(props, state, context);
-
- // context to pass to the child, can be updated via (grand-)parent component
- if (component.getChildContext) {
- context = extend(extend({}, context), component.getChildContext());
- }
-
- var childComponent = rendered && rendered.nodeName,
- toUnmount,
- base;
-
- if (typeof childComponent === 'function') {
- // set up high order component link
-
- var childProps = getNodeProps(rendered);
- inst = initialChildComponent;
-
- if (inst && inst.constructor === childComponent && childProps.key == inst.__key) {
- setComponentProps(inst, childProps, 1, context, false);
- } else {
- toUnmount = inst;
-
- component._component = inst = createComponent(childComponent, childProps, context);
- inst.nextBase = inst.nextBase || nextBase;
- inst._parentComponent = component;
- setComponentProps(inst, childProps, 0, context, false);
- renderComponent(inst, 1, mountAll, true);
- }
-
- base = inst.base;
- } else {
- cbase = initialBase;
-
- // destroy high order component link
- toUnmount = initialChildComponent;
- if (toUnmount) {
- cbase = component._component = null;
- }
-
- if (initialBase || opts === 1) {
- if (cbase) cbase._component = null;
- base = diff(cbase, rendered, context, mountAll || !isUpdate, initialBase && initialBase.parentNode, true);
- }
- }
-
- if (initialBase && base !== initialBase && inst !== initialChildComponent) {
- var baseParent = initialBase.parentNode;
- if (baseParent && base !== baseParent) {
- baseParent.replaceChild(base, initialBase);
-
- if (!toUnmount) {
- initialBase._component = null;
- recollectNodeTree(initialBase, false);
- }
- }
- }
-
- if (toUnmount) {
- unmountComponent(toUnmount);
- }
-
- component.base = base;
- if (base && !isChild) {
- var componentRef = component,
- t = component;
- while (t = t._parentComponent) {
- (componentRef = t).base = base;
- }
- base._component = componentRef;
- base._componentConstructor = componentRef.constructor;
- }
- }
-
- if (!isUpdate || mountAll) {
- mounts.unshift(component);
- } else if (!skip) {
- // Ensure that pending componentDidMount() hooks of child components
- // are called before the componentDidUpdate() hook in the parent.
- // Note: disabled as it causes duplicate hooks, see https://github.com/developit/preact/issues/750
- // flushMounts();
-
- if (component.componentDidUpdate) {
- component.componentDidUpdate(previousProps, previousState, previousContext);
- }
- if (options.afterUpdate) options.afterUpdate(component);
- }
-
- if (component._renderCallbacks != null) {
- while (component._renderCallbacks.length) {
- component._renderCallbacks.pop().call(component);
- }
- }
-
- if (!diffLevel && !isChild) flushMounts();
-}
-
-/** Apply the Component referenced by a VNode to the DOM.
- * @param {Element} dom The DOM node to mutate
- * @param {VNode} vnode A Component-referencing VNode
- * @returns {Element} dom The created/mutated element
- * @private
- */
-function buildComponentFromVNode(dom, vnode, context, mountAll) {
- var c = dom && dom._component,
- originalComponent = c,
- oldDom = dom,
- isDirectOwner = c && dom._componentConstructor === vnode.nodeName,
- isOwner = isDirectOwner,
- props = getNodeProps(vnode);
- while (c && !isOwner && (c = c._parentComponent)) {
- isOwner = c.constructor === vnode.nodeName;
- }
-
- if (c && isOwner && (!mountAll || c._component)) {
- setComponentProps(c, props, 3, context, mountAll);
- dom = c.base;
- } else {
- if (originalComponent && !isDirectOwner) {
- unmountComponent(originalComponent);
- dom = oldDom = null;
- }
-
- c = createComponent(vnode.nodeName, props, context);
- if (dom && !c.nextBase) {
- c.nextBase = dom;
- // passing dom/oldDom as nextBase will recycle it if unused, so bypass recycling on L229:
- oldDom = null;
- }
- setComponentProps(c, props, 1, context, mountAll);
- dom = c.base;
-
- if (oldDom && dom !== oldDom) {
- oldDom._component = null;
- recollectNodeTree(oldDom, false);
- }
- }
-
- return dom;
-}
-
-/** Remove a component from the DOM and recycle it.
- * @param {Component} component The Component instance to unmount
- * @private
- */
-function unmountComponent(component) {
- if (options.beforeUnmount) options.beforeUnmount(component);
-
- var base = component.base;
-
- component._disable = true;
-
- if (component.componentWillUnmount) component.componentWillUnmount();
-
- component.base = null;
-
- // recursively tear down & recollect high-order component children:
- var inner = component._component;
- if (inner) {
- unmountComponent(inner);
- } else if (base) {
- if (base['__preactattr_'] && base['__preactattr_'].ref) base['__preactattr_'].ref(null);
-
- component.nextBase = base;
-
- removeNode(base);
- collectComponent(component);
-
- removeChildren(base);
- }
-
- if (component.__ref) component.__ref(null);
-}
-
-/** Base Component class.
- * Provides `setState()` and `forceUpdate()`, which trigger rendering.
- * @public
- *
- * @example
- * class MyFoo extends Component {
- * render(props, state) {
- * return ;
- * }
- * }
- */
-function Component(props, context) {
- this._dirty = true;
-
- /** @public
- * @type {object}
- */
- this.context = context;
-
- /** @public
- * @type {object}
- */
- this.props = props;
-
- /** @public
- * @type {object}
- */
- this.state = this.state || {};
-}
-
-extend(Component.prototype, {
-
- /** Returns a `boolean` indicating if the component should re-render when receiving the given `props` and `state`.
- * @param {object} nextProps
- * @param {object} nextState
- * @param {object} nextContext
- * @returns {Boolean} should the component re-render
- * @name shouldComponentUpdate
- * @function
- */
-
- /** Update component state by copying properties from `state` to `this.state`.
- * @param {object} state A hash of state properties to update with new values
- * @param {function} callback A function to be called once component state is updated
- */
- setState: function setState(state, callback) {
- var s = this.state;
- if (!this.prevState) this.prevState = extend({}, s);
- extend(s, typeof state === 'function' ? state(s, this.props) : state);
- if (callback) (this._renderCallbacks = this._renderCallbacks || []).push(callback);
- enqueueRender(this);
- },
-
-
- /** Immediately perform a synchronous re-render of the component.
- * @param {function} callback A function to be called after component is re-rendered.
- * @private
- */
- forceUpdate: function forceUpdate(callback) {
- if (callback) (this._renderCallbacks = this._renderCallbacks || []).push(callback);
- renderComponent(this, 2);
- },
-
-
- /** Accepts `props` and `state`, and returns a new Virtual DOM tree to build.
- * Virtual DOM is generally constructed via [JSX](http://jasonformat.com/wtf-is-jsx).
- * @param {object} props Props (eg: JSX attributes) received from parent element/component
- * @param {object} state The component's current state
- * @param {object} context Context object (if a parent component has provided context)
- * @returns VNode
- */
- render: function render() {}
-});
-
-/** Render JSX into a `parent` Element.
- * @param {VNode} vnode A (JSX) VNode to render
- * @param {Element} parent DOM element to render into
- * @param {Element} [merge] Attempt to re-use an existing DOM tree rooted at `merge`
- * @public
- *
- * @example
- * // render a div into :
- * render(hello!
, document.body);
- *
- * @example
- * // render a "Thing" component into #foo:
- * const Thing = ({ name }) => { name };
- * render(, document.querySelector('#foo'));
- */
-function render(vnode, parent, merge) {
- return diff(merge, vnode, {}, false, parent, false);
-}
-
-var preact = {
- h: h,
- createElement: h,
- cloneElement: cloneElement,
- Component: Component,
- render: render,
- rerender: rerender,
- options: options
-};
-
-/* harmony default export */ __webpack_exports__["default"] = (preact);
-//# sourceMappingURL=preact.esm.js.map
+/***/ "./lib/Track.js":
+/*!**********************!*\
+ !*** ./lib/Track.js ***!
+ \**********************/
+/***/ ((module) => {
+eval("{function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n/**\n * @author Timur Kuzhagaliyev \n * @copyright 2017\n * @license GPL-3.0\n */\n\nvar SourceTypes = {\n URL: 'url',\n FILE: 'file',\n ARRAY_BUFFER: 'arrayBuffer'\n};\nvar Track = /*#__PURE__*/function () {\n /**\n * @param {object} data\n * @param {string|File} data.source\n * @param {string} [data.title]\n */\n function Track(data) {\n _classCallCheck(this, Track);\n this.source = data.source;\n this.title = data.title;\n this.arrayBufferCache = null;\n this.analyseSource();\n }\n return _createClass(Track, [{\n key: \"analyseSource\",\n value: function analyseSource() {\n if (typeof this.source === 'string') {\n this.sourceType = SourceTypes.URL;\n this.title = this.title || decodeURIComponent(this.source.split('/').pop().replace(/\\.[a-zA-Z0-9]+$/, ''));\n } else if (this.source instanceof File) {\n this.sourceType = SourceTypes.FILE;\n this.title = this.title || this.source.name.replace(/\\.[a-zA-Z0-9]+$/, '');\n } else if (this.source instanceof ArrayBuffer) {\n this.sourceType = SourceTypes.ARRAY_BUFFER;\n this.title = this.title || 'Untitled';\n } else {\n throw new Error(\"'Unsupported Track source type: \".concat(this.source));\n }\n }\n\n /**\n * @return {Promise.}\n */\n }, {\n key: \"prepareArrayBuffer\",\n value: function prepareArrayBuffer() {\n var _this = this;\n if (this.arrayBufferCache) return Promise.resolve(this.arrayBufferCache);\n switch (this.sourceType) {\n case SourceTypes.URL:\n return window.fetch(this.source).then(function (response) {\n if (!response.ok) {\n throw new Error(\"HTTP \".concat(response.status, \": \").concat(response.statusText));\n }\n return response.arrayBuffer();\n }).then(function (arrayBuffer) {\n // Clone the buffer to prevent detachment issues\n var clonedBuffer = arrayBuffer.slice(0);\n _this.arrayBufferCache = clonedBuffer;\n return clonedBuffer;\n });\n case SourceTypes.FILE:\n return new Promise(function (resolve, reject) {\n var reader = new window.FileReader();\n reader.onload = function (fileEvent) {\n var arrayBuffer = fileEvent.target.result;\n _this.arrayBufferCache = arrayBuffer;\n resolve(arrayBuffer);\n };\n reader.onerror = function (error) {\n reject(error);\n };\n reader.readAsArrayBuffer(_this.source);\n });\n case SourceTypes.ARRAY_BUFFER:\n return Promise.resolve(this.source);\n default:\n return Promise.reject(new Error(\"'Unsupported track source type: \".concat(this.sourceType)));\n }\n }\n }]);\n}();\nmodule.exports = Track;\nmodule.exports.SourceTypes = SourceTypes;\n\n//# sourceURL=webpack://Akko/./lib/Track.js?\n}");
/***/ }),
-/* 5 */
-/***/ (function(module, exports, __webpack_require__) {
-__webpack_require__(6);
-__webpack_require__(7);
-module.exports = __webpack_require__(8);
-
-
-/***/ }),
-/* 6 */
-/***/ (function(module, exports) {
+/***/ "./lib/UI.jsx":
+/*!********************!*\
+ !*** ./lib/UI.jsx ***!
+ \********************/
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
-// removed by extract-text-webpack-plugin
+eval("{function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n/**\n * @author Timur Kuzhagaliyev \n * @copyright 2017\n * @license GPL-3.0\n */\n\n// eslint-disable-next-line\nvar _require = __webpack_require__(/*! preact */ \"./node_modules/preact/dist/preact.mjs\"),\n render = _require.render,\n h = _require.h;\n// eslint-disable-next-line\nvar UIComponent = __webpack_require__(/*! ./UIComponent.jsx */ \"./lib/UIComponent.jsx\");\nvar UI = /*#__PURE__*/function () {\n /**\n * @param {object} data\n * @param {Element} data.container\n * @param {MusicPlayer} data.musicPlayer\n * @param {VisualisationCore} data.visCore\n */\n function UI(data) {\n _classCallCheck(this, UI);\n this.container = data.container;\n this.musicPlayer = data.musicPlayer;\n this.visCore = data.visCore;\n }\n return _createClass(UI, [{\n key: \"start\",\n value: function start() {\n render(h(UIComponent, {\n musicPlayer: this.musicPlayer,\n visCore: this.visCore\n }), this.container);\n }\n }]);\n}();\nmodule.exports = UI;\n\n//# sourceURL=webpack://Akko/./lib/UI.jsx?\n}");
/***/ }),
-/* 7 */
-/***/ (function(module, exports) {
-(function(self) {
- 'use strict';
-
- if (self.fetch) {
- return
- }
-
- var support = {
- searchParams: 'URLSearchParams' in self,
- iterable: 'Symbol' in self && 'iterator' in Symbol,
- blob: 'FileReader' in self && 'Blob' in self && (function() {
- try {
- new Blob()
- return true
- } catch(e) {
- return false
- }
- })(),
- formData: 'FormData' in self,
- arrayBuffer: 'ArrayBuffer' in self
- }
-
- if (support.arrayBuffer) {
- var viewClasses = [
- '[object Int8Array]',
- '[object Uint8Array]',
- '[object Uint8ClampedArray]',
- '[object Int16Array]',
- '[object Uint16Array]',
- '[object Int32Array]',
- '[object Uint32Array]',
- '[object Float32Array]',
- '[object Float64Array]'
- ]
-
- var isDataView = function(obj) {
- return obj && DataView.prototype.isPrototypeOf(obj)
- }
-
- var isArrayBufferView = ArrayBuffer.isView || function(obj) {
- return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1
- }
- }
-
- function normalizeName(name) {
- if (typeof name !== 'string') {
- name = String(name)
- }
- if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) {
- throw new TypeError('Invalid character in header field name')
- }
- return name.toLowerCase()
- }
-
- function normalizeValue(value) {
- if (typeof value !== 'string') {
- value = String(value)
- }
- return value
- }
-
- // Build a destructive iterator for the value list
- function iteratorFor(items) {
- var iterator = {
- next: function() {
- var value = items.shift()
- return {done: value === undefined, value: value}
- }
- }
-
- if (support.iterable) {
- iterator[Symbol.iterator] = function() {
- return iterator
- }
- }
-
- return iterator
- }
-
- function Headers(headers) {
- this.map = {}
-
- if (headers instanceof Headers) {
- headers.forEach(function(value, name) {
- this.append(name, value)
- }, this)
- } else if (Array.isArray(headers)) {
- headers.forEach(function(header) {
- this.append(header[0], header[1])
- }, this)
- } else if (headers) {
- Object.getOwnPropertyNames(headers).forEach(function(name) {
- this.append(name, headers[name])
- }, this)
- }
- }
-
- Headers.prototype.append = function(name, value) {
- name = normalizeName(name)
- value = normalizeValue(value)
- var oldValue = this.map[name]
- this.map[name] = oldValue ? oldValue+','+value : value
- }
-
- Headers.prototype['delete'] = function(name) {
- delete this.map[normalizeName(name)]
- }
-
- Headers.prototype.get = function(name) {
- name = normalizeName(name)
- return this.has(name) ? this.map[name] : null
- }
-
- Headers.prototype.has = function(name) {
- return this.map.hasOwnProperty(normalizeName(name))
- }
-
- Headers.prototype.set = function(name, value) {
- this.map[normalizeName(name)] = normalizeValue(value)
- }
-
- Headers.prototype.forEach = function(callback, thisArg) {
- for (var name in this.map) {
- if (this.map.hasOwnProperty(name)) {
- callback.call(thisArg, this.map[name], name, this)
- }
- }
- }
-
- Headers.prototype.keys = function() {
- var items = []
- this.forEach(function(value, name) { items.push(name) })
- return iteratorFor(items)
- }
-
- Headers.prototype.values = function() {
- var items = []
- this.forEach(function(value) { items.push(value) })
- return iteratorFor(items)
- }
-
- Headers.prototype.entries = function() {
- var items = []
- this.forEach(function(value, name) { items.push([name, value]) })
- return iteratorFor(items)
- }
-
- if (support.iterable) {
- Headers.prototype[Symbol.iterator] = Headers.prototype.entries
- }
-
- function consumed(body) {
- if (body.bodyUsed) {
- return Promise.reject(new TypeError('Already read'))
- }
- body.bodyUsed = true
- }
-
- function fileReaderReady(reader) {
- return new Promise(function(resolve, reject) {
- reader.onload = function() {
- resolve(reader.result)
- }
- reader.onerror = function() {
- reject(reader.error)
- }
- })
- }
-
- function readBlobAsArrayBuffer(blob) {
- var reader = new FileReader()
- var promise = fileReaderReady(reader)
- reader.readAsArrayBuffer(blob)
- return promise
- }
-
- function readBlobAsText(blob) {
- var reader = new FileReader()
- var promise = fileReaderReady(reader)
- reader.readAsText(blob)
- return promise
- }
-
- function readArrayBufferAsText(buf) {
- var view = new Uint8Array(buf)
- var chars = new Array(view.length)
-
- for (var i = 0; i < view.length; i++) {
- chars[i] = String.fromCharCode(view[i])
- }
- return chars.join('')
- }
-
- function bufferClone(buf) {
- if (buf.slice) {
- return buf.slice(0)
- } else {
- var view = new Uint8Array(buf.byteLength)
- view.set(new Uint8Array(buf))
- return view.buffer
- }
- }
-
- function Body() {
- this.bodyUsed = false
-
- this._initBody = function(body) {
- this._bodyInit = body
- if (!body) {
- this._bodyText = ''
- } else if (typeof body === 'string') {
- this._bodyText = body
- } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
- this._bodyBlob = body
- } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
- this._bodyFormData = body
- } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
- this._bodyText = body.toString()
- } else if (support.arrayBuffer && support.blob && isDataView(body)) {
- this._bodyArrayBuffer = bufferClone(body.buffer)
- // IE 10-11 can't handle a DataView body.
- this._bodyInit = new Blob([this._bodyArrayBuffer])
- } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {
- this._bodyArrayBuffer = bufferClone(body)
- } else {
- throw new Error('unsupported BodyInit type')
- }
-
- if (!this.headers.get('content-type')) {
- if (typeof body === 'string') {
- this.headers.set('content-type', 'text/plain;charset=UTF-8')
- } else if (this._bodyBlob && this._bodyBlob.type) {
- this.headers.set('content-type', this._bodyBlob.type)
- } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
- this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')
- }
- }
- }
-
- if (support.blob) {
- this.blob = function() {
- var rejected = consumed(this)
- if (rejected) {
- return rejected
- }
-
- if (this._bodyBlob) {
- return Promise.resolve(this._bodyBlob)
- } else if (this._bodyArrayBuffer) {
- return Promise.resolve(new Blob([this._bodyArrayBuffer]))
- } else if (this._bodyFormData) {
- throw new Error('could not read FormData body as blob')
- } else {
- return Promise.resolve(new Blob([this._bodyText]))
- }
- }
-
- this.arrayBuffer = function() {
- if (this._bodyArrayBuffer) {
- return consumed(this) || Promise.resolve(this._bodyArrayBuffer)
- } else {
- return this.blob().then(readBlobAsArrayBuffer)
- }
- }
- }
-
- this.text = function() {
- var rejected = consumed(this)
- if (rejected) {
- return rejected
- }
-
- if (this._bodyBlob) {
- return readBlobAsText(this._bodyBlob)
- } else if (this._bodyArrayBuffer) {
- return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))
- } else if (this._bodyFormData) {
- throw new Error('could not read FormData body as text')
- } else {
- return Promise.resolve(this._bodyText)
- }
- }
-
- if (support.formData) {
- this.formData = function() {
- return this.text().then(decode)
- }
- }
-
- this.json = function() {
- return this.text().then(JSON.parse)
- }
-
- return this
- }
-
- // HTTP methods whose capitalization should be normalized
- var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']
-
- function normalizeMethod(method) {
- var upcased = method.toUpperCase()
- return (methods.indexOf(upcased) > -1) ? upcased : method
- }
-
- function Request(input, options) {
- options = options || {}
- var body = options.body
-
- if (input instanceof Request) {
- if (input.bodyUsed) {
- throw new TypeError('Already read')
- }
- this.url = input.url
- this.credentials = input.credentials
- if (!options.headers) {
- this.headers = new Headers(input.headers)
- }
- this.method = input.method
- this.mode = input.mode
- if (!body && input._bodyInit != null) {
- body = input._bodyInit
- input.bodyUsed = true
- }
- } else {
- this.url = String(input)
- }
-
- this.credentials = options.credentials || this.credentials || 'omit'
- if (options.headers || !this.headers) {
- this.headers = new Headers(options.headers)
- }
- this.method = normalizeMethod(options.method || this.method || 'GET')
- this.mode = options.mode || this.mode || null
- this.referrer = null
-
- if ((this.method === 'GET' || this.method === 'HEAD') && body) {
- throw new TypeError('Body not allowed for GET or HEAD requests')
- }
- this._initBody(body)
- }
-
- Request.prototype.clone = function() {
- return new Request(this, { body: this._bodyInit })
- }
-
- function decode(body) {
- var form = new FormData()
- body.trim().split('&').forEach(function(bytes) {
- if (bytes) {
- var split = bytes.split('=')
- var name = split.shift().replace(/\+/g, ' ')
- var value = split.join('=').replace(/\+/g, ' ')
- form.append(decodeURIComponent(name), decodeURIComponent(value))
- }
- })
- return form
- }
-
- function parseHeaders(rawHeaders) {
- var headers = new Headers()
- rawHeaders.split(/\r?\n/).forEach(function(line) {
- var parts = line.split(':')
- var key = parts.shift().trim()
- if (key) {
- var value = parts.join(':').trim()
- headers.append(key, value)
- }
- })
- return headers
- }
-
- Body.call(Request.prototype)
-
- function Response(bodyInit, options) {
- if (!options) {
- options = {}
- }
-
- this.type = 'default'
- this.status = 'status' in options ? options.status : 200
- this.ok = this.status >= 200 && this.status < 300
- this.statusText = 'statusText' in options ? options.statusText : 'OK'
- this.headers = new Headers(options.headers)
- this.url = options.url || ''
- this._initBody(bodyInit)
- }
-
- Body.call(Response.prototype)
-
- Response.prototype.clone = function() {
- return new Response(this._bodyInit, {
- status: this.status,
- statusText: this.statusText,
- headers: new Headers(this.headers),
- url: this.url
- })
- }
-
- Response.error = function() {
- var response = new Response(null, {status: 0, statusText: ''})
- response.type = 'error'
- return response
- }
-
- var redirectStatuses = [301, 302, 303, 307, 308]
-
- Response.redirect = function(url, status) {
- if (redirectStatuses.indexOf(status) === -1) {
- throw new RangeError('Invalid status code')
- }
-
- return new Response(null, {status: status, headers: {location: url}})
- }
-
- self.Headers = Headers
- self.Request = Request
- self.Response = Response
-
- self.fetch = function(input, init) {
- return new Promise(function(resolve, reject) {
- var request = new Request(input, init)
- var xhr = new XMLHttpRequest()
-
- xhr.onload = function() {
- var options = {
- status: xhr.status,
- statusText: xhr.statusText,
- headers: parseHeaders(xhr.getAllResponseHeaders() || '')
- }
- options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')
- var body = 'response' in xhr ? xhr.response : xhr.responseText
- resolve(new Response(body, options))
- }
-
- xhr.onerror = function() {
- reject(new TypeError('Network request failed'))
- }
-
- xhr.ontimeout = function() {
- reject(new TypeError('Network request failed'))
- }
-
- xhr.open(request.method, request.url, true)
-
- if (request.credentials === 'include') {
- xhr.withCredentials = true
- }
-
- if ('responseType' in xhr && support.blob) {
- xhr.responseType = 'blob'
- }
-
- request.headers.forEach(function(value, name) {
- xhr.setRequestHeader(name, value)
- })
-
- xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)
- })
- }
- self.fetch.polyfill = true
-})(typeof self !== 'undefined' ? self : this);
+/***/ "./lib/UIComponent.jsx":
+/*!*****************************!*\
+ !*** ./lib/UIComponent.jsx ***!
+ \*****************************/
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
+eval("{function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }\nfunction _possibleConstructorReturn(t, e) { if (e && (\"object\" == _typeof(e) || \"function\" == typeof e)) return e; if (void 0 !== e) throw new TypeError(\"Derived constructors may only return object or undefined\"); return _assertThisInitialized(t); }\nfunction _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); return e; }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\nfunction _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }\nfunction _inherits(t, e) { if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, \"prototype\", { writable: !1 }), e && _setPrototypeOf(t, e); }\nfunction _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }\n/**\n * @author Timur Kuzhagaliyev \n * @copyright 2017\n * @license GPL-3.0\n */\n\n// eslint-disable-next-line\nvar _require = __webpack_require__(/*! preact */ \"./node_modules/preact/dist/preact.mjs\"),\n Component = _require.Component,\n h = _require.h;\nvar PlayerStates = (__webpack_require__(/*! ./MusicPlayer */ \"./lib/MusicPlayer.js\").States);\nvar UIComponent = /*#__PURE__*/function (_Component) {\n function UIComponent(props) {\n var _this;\n _classCallCheck(this, UIComponent);\n _this = _callSuper(this, UIComponent, [props]);\n _this.state = {\n playerState: null,\n trackList: [],\n currentTrackIndex: null,\n visualisers: [],\n currentVisualiserIndex: null\n };\n props.musicPlayer.addListener(_this.playbackListener.bind(_this));\n props.visCore.addListener(_this.visualiserListener.bind(_this));\n return _this;\n }\n _inherits(UIComponent, _Component);\n return _createClass(UIComponent, [{\n key: \"playbackListener\",\n value: function playbackListener(playerState, trackList, currentTrackIndex) {\n this.setState({\n playerState: playerState,\n trackList: trackList,\n currentTrackIndex: currentTrackIndex\n });\n }\n }, {\n key: \"visualiserListener\",\n value: function visualiserListener(visualisers, currentVisualiserIndex) {\n this.setState({\n visualisers: visualisers,\n currentVisualiserIndex: currentVisualiserIndex\n });\n }\n }, {\n key: \"playTrack\",\n value: function playTrack(index, event) {\n event.preventDefault();\n this.props.musicPlayer.playTrack(index);\n }\n }, {\n key: \"togglePlayback\",\n value: function togglePlayback(event) {\n event.preventDefault();\n var state = this.state;\n state.playing = this.props.musicPlayer.togglePlayback();\n this.setState(state);\n }\n }, {\n key: \"addTrackByUrl\",\n value: function addTrackByUrl(event) {\n event.preventDefault();\n var audioUrl = prompt('Enter the URL of an audio file');\n if (audioUrl) {\n this.props.musicPlayer.addTrack(audioUrl);\n }\n }\n }, {\n key: \"uploadAudioFile\",\n value: function uploadAudioFile(event) {\n event.preventDefault();\n if (!this.fileInput) return;\n if (!this.fileInput.onchange) this.fileInput.onchange = this.addAudioFile.bind(this);\n this.fileInput.click();\n }\n }, {\n key: \"addAudioFile\",\n value: function addAudioFile() {\n var files = this.fileInput.files;\n for (var i = 0; i < files.length; i++) {\n var file = files[i];\n if (file.type.match(/audio.*/)) {\n this.props.musicPlayer.addTrack(file);\n }\n }\n }\n }, {\n key: \"getTrackList\",\n value: function getTrackList() {\n var trackList = this.state.trackList;\n if (trackList) {\n var trackComponents = [];\n for (var i = 0; i < trackList.length; i++) {\n var track = trackList[i];\n var isActive = this.state.currentTrackIndex === i;\n var activeClass = isActive ? 'active' : '';\n var symbol = isActive ? this.getPlaybackSymbol() : \"#\".concat(i + 1);\n trackComponents.push(h(\"a\", {\n href: \"#\",\n alt: \"Play track #\".concat(i + 1),\n onClick: this.playTrack.bind(this, i),\n className: \"akko-ui-container-list-item \".concat(activeClass)\n }, h(\"span\", null, symbol), \" \", track.title));\n }\n return h(\"div\", {\n className: \"akko-ui-container-list\"\n }, trackComponents);\n } else {\n return null;\n }\n }\n }, {\n key: \"getPlaybackSymbol\",\n value: function getPlaybackSymbol() {\n return !this.isPlaying() ? '❚❚' : '►';\n }\n }, {\n key: \"getPlaybackButtonSymbol\",\n value: function getPlaybackButtonSymbol() {\n return this.isPlaying() ? '❚❚' : '►';\n }\n }, {\n key: \"isPlaying\",\n value: function isPlaying() {\n return this.state.playerState === PlayerStates.PLAYING;\n }\n }, {\n key: \"useVisualiser\",\n value: function useVisualiser(index, event) {\n event.preventDefault();\n this.props.visCore.useVisualiser(index);\n }\n }, {\n key: \"getVisualiserList\",\n value: function getVisualiserList() {\n var visualisers = this.state.visualisers;\n if (visualisers) {\n var visualiserComponents = [];\n for (var i = 0; i < visualisers.length; i++) {\n var visualiser = visualisers[i];\n var isActive = this.state.currentVisualiserIndex === i;\n var activeClass = isActive ? 'active' : '';\n var symbol = visualiser.code;\n visualiserComponents.push(h(\"a\", {\n href: \"#\",\n alt: \"Use visualiser #\".concat(i + 1),\n onClick: this.useVisualiser.bind(this, i),\n className: \"akko-ui-container-list-item \".concat(activeClass)\n }, h(\"span\", null, symbol), \" \", visualiser.name));\n }\n return h(\"div\", {\n className: \"akko-ui-container-list\"\n }, visualiserComponents);\n } else {\n return null;\n }\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this2 = this;\n return h(\"div\", {\n className: \"akko-ui\"\n }, h(\"div\", {\n className: \"akko-ui-container akko-ui-tracks\"\n }, h(\"div\", {\n className: \"akko-ui-container-title\"\n }, \"Player: \", this.state.playerState), this.getTrackList(), h(\"div\", {\n className: \"akko-ui-add-tracks\"\n }, h(\"input\", {\n ref: function ref(input) {\n return _this2.fileInput = input;\n },\n type: \"file\",\n style: \"display: none;\"\n }), h(\"a\", {\n href: \"#\",\n alt: \"Add a track by URL\",\n onClick: this.addTrackByUrl.bind(this)\n }, \"Add track by URL\"), \" or \", h(\"a\", {\n href: \"#\",\n alt: \"Upload an audio file\",\n onClick: this.uploadAudioFile.bind(this)\n }, \"upload audio file\"), h(\"br\", null), \"or drag & drop a file into the visualiser.\")), h(\"div\", {\n className: \"akko-ui-container akko-ui-visualisers\"\n }, h(\"div\", {\n className: \"akko-ui-container-title\"\n }, \"Visualisers\"), this.getVisualiserList()), h(\"div\", {\n className: \"akko-ui-controls\"\n }, h(\"a\", {\n href: \"#\",\n alt: \"Toggle playback\",\n onClick: this.togglePlayback.bind(this),\n className: \"akko-ui-controls-play \".concat(this.isPlaying() ? 'active' : '')\n }, this.getPlaybackButtonSymbol()), h(\"div\", {\n className: \"akko-ui-controls-progress\"\n }, h(\"div\", {\n className: \"akko-ui-controls-progress-indicator\"\n })), h(\"div\", {\n className: \"akko-ui-controls-volume\"\n })));\n }\n }]);\n}(Component);\nmodule.exports = UIComponent;\n\n//# sourceURL=webpack://Akko/./lib/UIComponent.jsx?\n}");
/***/ }),
-/* 8 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-/**
- * @author Timur Kuzhagaliyev
- * @copyright 2017
- * @license GPL-3.0
- */
-
-var Akko = __webpack_require__(9);
-var Visualiser = __webpack_require__(1);
-var Visualisers = __webpack_require__(3);
+/***/ "./lib/VisualisationCore.js":
+/*!**********************************!*\
+ !*** ./lib/VisualisationCore.js ***!
+ \**********************************/
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
-module.exports = Akko;
-module.exports.Visualiser = Visualiser;
-module.exports.visualisers = Visualisers;
+eval("{function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n/**\n * @author Timur Kuzhagaliyev \n * @copyright 2017\n * @license GPL-3.0\n */\n\nvar THREE = __webpack_require__(/*! three */ \"three\");\nvar elementResizeEvent = __webpack_require__(/*! element-resize-event */ \"./node_modules/element-resize-event/index.js\");\nvar Visualisers = __webpack_require__(/*! ./visualisers */ \"./lib/visualisers/index.js\");\nvar VisualisationCore = /*#__PURE__*/function () {\n /**\n * @param {object} data\n * @param {Element} data.parentElement\n * @param {boolean} data.useDefaultVisualisers\n * @param {object} data.analyser\n */\n function VisualisationCore(data) {\n _classCallCheck(this, VisualisationCore);\n this.parentElement = data.parentElement;\n this.frequencyDataArray = null;\n this.analyser = data.analyser;\n\n /**\n * @callback visualiserListener\n * @param {Track[]} visualisers\n * @param {int} currentVisualiserIndex\n */\n /** @type {visualiserListener[]} */\n this.listeners = [];\n this.visualisers = data.useDefaultVisualisers ? this.prepareDefaultVisualisers() : [];\n this.currentVisualiserIndex = -1;\n }\n return _createClass(VisualisationCore, [{\n key: \"prepareDefaultVisualisers\",\n value: function prepareDefaultVisualisers() {\n var visualisers = [];\n for (var key in Visualisers) {\n if (!Visualisers.hasOwnProperty(key)) continue;\n var visualiserClass = Visualisers[key];\n visualisers.push(new visualiserClass());\n }\n return visualisers;\n }\n }, {\n key: \"notifyListeners\",\n value: function notifyListeners() {\n for (var i = 0; i < this.listeners.length; i++) {\n var listener = this.listeners[i];\n listener(this.visualisers, this.currentVisualiserIndex);\n }\n }\n\n /**\n * @param {visualiserListener} listener\n */\n }, {\n key: \"addListener\",\n value: function addListener(listener) {\n this.listeners.push(listener);\n this.notifyListeners();\n }\n\n /**\n * @param {Visualiser} visualiser\n */\n }, {\n key: \"addVisualiser\",\n value: function addVisualiser(visualiser) {\n this.visualisers.push(visualiser);\n this.notifyListeners();\n }\n }, {\n key: \"prepare\",\n value: function prepare() {\n var width = this.parentElement.offsetWidth;\n var height = this.parentElement.offsetHeight;\n this.renderer = new THREE.WebGLRenderer();\n this.renderer.setSize(width, height);\n this.canvas = this.renderer.domElement;\n this.parentElement.appendChild(this.canvas);\n }\n }, {\n key: \"start\",\n value: function start() {\n this.setupListeners();\n this.renderLoop();\n this.notifyListeners();\n }\n\n /**\n * @param {int} index\n */\n }, {\n key: \"useVisualiser\",\n value: function useVisualiser(index) {\n var visualiser = this.visualisers[index];\n if (visualiser) this.prepareVisualiser(visualiser);\n if (this.visualiser) this.visualiser.pause();\n this.currentVisualiserIndex = index;\n this.visualiser = visualiser;\n this.notifyListeners();\n }\n\n /**\n * @param {Visualiser} visualiser\n */\n }, {\n key: \"prepareVisualiser\",\n value: function prepareVisualiser(visualiser) {\n this.analyser.fftSize = visualiser.fftSize;\n this.analyser.smoothingTimeConstant = visualiser.smoothingTimeConstant;\n this.frequencyDataArray = new Float32Array(this.analyser.frequencyBinCount);\n this.timeDomainDataArray = new Float32Array(this.analyser.frequencyBinCount);\n var data = {\n renderer: this.renderer,\n analyser: this.analyser,\n width: this.canvas.clientWidth,\n height: this.canvas.clientHeight\n };\n if (!visualiser.isInitialised()) visualiser.init(data);else if (visualiser.isPaused()) visualiser.revive(data);\n visualiser.resize(data);\n }\n }, {\n key: \"setupListeners\",\n value: function setupListeners() {\n elementResizeEvent(this.parentElement, this.onParentResize.bind(this));\n }\n }, {\n key: \"renderLoop\",\n value: function renderLoop() {\n var _this = this;\n if (this.visualiser) {\n if (this.analyser) {\n this.analyser.getFloatFrequencyData(this.frequencyDataArray);\n this.analyser.getFloatTimeDomainData(this.timeDomainDataArray);\n }\n this.visualiser.update({\n renderer: this.renderer,\n analyser: this.analyser,\n frequencyData: this.frequencyDataArray,\n timeDomainData: this.timeDomainDataArray\n });\n } else {\n // TODO: Display warning about no visualiser\n }\n setTimeout(function () {\n requestAnimationFrame(_this.renderLoop.bind(_this));\n }, 1000 / 30);\n }\n }, {\n key: \"onParentResize\",\n value: function onParentResize() {\n var width = this.parentElement.offsetWidth;\n var height = this.parentElement.offsetHeight;\n this.renderer.setSize(width, height);\n if (this.visualiser) this.visualiser.resize({\n renderer: this.renderer,\n width: width,\n height: height\n });\n }\n }]);\n}();\nmodule.exports = VisualisationCore;\n\n//# sourceURL=webpack://Akko/./lib/VisualisationCore.js?\n}");
/***/ }),
-/* 9 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
+/***/ "./lib/Visualiser.js":
+/*!***************************!*\
+ !*** ./lib/Visualiser.js ***!
+ \***************************/
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-/**
- * @author Timur Kuzhagaliyev
- * @copyright 2017
- * @license GPL-3.0
- */
-
-var THREE = __webpack_require__(0);
+eval("{function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }\nfunction _possibleConstructorReturn(t, e) { if (e && (\"object\" == _typeof(e) || \"function\" == typeof e)) return e; if (void 0 !== e) throw new TypeError(\"Derived constructors may only return object or undefined\"); return _assertThisInitialized(t); }\nfunction _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); return e; }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\nfunction _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }\nfunction _inherits(t, e) { if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, \"prototype\", { writable: !1 }), e && _setPrototypeOf(t, e); }\nfunction _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }\n/**\n * @author Timur Kuzhagaliyev \n * @copyright 2017\n * @license GPL-3.0\n */\n\nvar Helper = __webpack_require__(/*! ./Helper */ \"./lib/Helper.js\");\n\n/**\n * @abstract\n */\nvar Visualiser = /*#__PURE__*/function (_Helper) {\n /**\n * @param {object} data\n * @param {string} data.code\n * @param {string} data.name\n * @param {int} data.fftSize\n * @param {number} data.smoothingTimeConstant\n */\n function Visualiser(data) {\n var _this;\n _classCallCheck(this, Visualiser);\n _this = _callSuper(this, Visualiser);\n _this.code = data.code || 'UV';\n _this.name = data.name || 'Untitled Visualiser';\n _this.fftSize = data.fftSize || 128;\n _this.smoothingTimeConstant = data.smoothingTimeConstant || 0;\n _this.initialised = false;\n _this.paused = false;\n return _this;\n }\n\n /**\n * @param {object} data\n * @param {THREE.WebGLRenderer} data.renderer\n * @param {AnalyserNode} data.analyser\n * @param {number} data.height\n * @param {number} data.width\n */\n _inherits(Visualiser, _Helper);\n return _createClass(Visualiser, [{\n key: \"init\",\n value: function init(data) {\n this.onInit(data);\n this.initialised = true;\n }\n\n /**\n * @abstract\n * @param {object} data\n * @param {THREE.WebGLRenderer} data.renderer\n * @param {AnalyserNode} data.analyser\n * @param {number} data.height\n * @param {number} data.width\n */\n // eslint-disable-next-line\n }, {\n key: \"onInit\",\n value: function onInit(data) {\n throw new Error(\"The 'onInit' method was not defined on \".concat(this.name, \"!\"));\n }\n\n /**\n * @param {object} data\n * @param {THREE.WebGLRenderer} data.renderer\n * @param {AnalyserNode} data.analyser\n * @param {number} data.height\n * @param {number} data.width\n */\n }, {\n key: \"revive\",\n value: function revive(data) {\n this.onRevive(data);\n this.paused = false;\n }\n\n /**\n * @abstract\n * @param {object} data\n * @param {THREE.WebGLRenderer} data.renderer\n * @param {AnalyserNode} data.analyser\n * @param {number} data.height\n * @param {number} data.width\n */\n // eslint-disable-next-line\n }, {\n key: \"onRevive\",\n value: function onRevive(data) {}\n\n /**\n * @param {object} data\n * @param {THREE.WebGLRenderer} data.renderer\n * @param {AnalyserNode} data.analyser\n * @param {Float32Array} data.frequencyData\n * @param {Float32Array} data.timeDomainData\n */\n }, {\n key: \"update\",\n value: function update(data) {\n this.onUpdate(data);\n }\n\n /**\n * @abstract\n * @param {object} data\n * @param {THREE.WebGLRenderer} data.renderer\n * @param {AnalyserNode} data.analyser\n * @param {Float32Array} data.frequencyData\n * @param {Float32Array} data.timeDomainData\n */\n // eslint-disable-next-line\n }, {\n key: \"onUpdate\",\n value: function onUpdate(data) {\n throw new Error(\"The 'onUpdate' method was not defined on \".concat(this.name, \"!\"));\n }\n\n /**\n * @param {THREE.WebGLRenderer} data.renderer\n * @param {AnalyserNode} data.analyser\n * @param {number} data.height\n * @param {number} data.width\n */\n }, {\n key: \"resize\",\n value: function resize(data) {\n this.onResize(data);\n }\n\n /**\n * @abstract\n * @param {THREE.WebGLRenderer} data.renderer\n * @param {AnalyserNode} data.analyser\n * @param {number} data.height\n * @param {number} data.width\n */\n // eslint-disable-next-line\n }, {\n key: \"onResize\",\n value: function onResize(data) {}\n }, {\n key: \"pause\",\n value: function pause() {\n this.onPause();\n this.paused = true;\n }\n\n /**\n * @abstract\n */\n }, {\n key: \"onPause\",\n value: function onPause() {}\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.onDestroy();\n }\n\n /**\n * @abstract\n */\n }, {\n key: \"onDestroy\",\n value: function onDestroy() {\n throw new Error(\"The 'onDestroy' method was not defined on \".concat(this.name, \"!\"));\n }\n }, {\n key: \"error\",\n value: function error(message) {\n // TODO: Draw error message on canvas\n throw new Error(message);\n }\n }, {\n key: \"isInitialised\",\n value: function isInitialised() {\n return this.initialised;\n }\n }, {\n key: \"isPaused\",\n value: function isPaused() {\n return this.paused;\n }\n }]);\n}(Helper);\nmodule.exports = Visualiser;\n\n//# sourceURL=webpack://Akko/./lib/Visualiser.js?\n}");
-var MusicPlayer = __webpack_require__(2);
-var VisualisationCore = __webpack_require__(12);
-var UI = __webpack_require__(17);
-
-/**
- * @type {{containerId: string, useDefaultVisualisers: boolean, autoPlay: boolean}}
- */
-var defaultOptions = {
- containerId: 'akko',
- useDefaultVisualisers: true,
- autoPlay: false
-};
-
-/**
- * @return {{containerId: string, useDefaultVisualisers: boolean, autoPlay: boolean}}
- */
-var mergeOptions = function mergeOptions() {
- var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
-
- var result = {};
- for (var key in defaultOptions) {
- if (!defaultOptions.hasOwnProperty(key)) continue;
- result[key] = options[key] !== undefined ? options[key] : defaultOptions[key];
- }
- return result;
-};
-
-var Akko = function () {
- function Akko(options) {
- _classCallCheck(this, Akko);
-
- if (!THREE) throw new Error('Akko could not find three.js (`THREE`)!');
- if (!window) throw new Error('Akko could not find `window` variable! Are you running Akko in browser?');
- if (!document) throw new Error('Akko could not find `document` variable! Are you running Akko in browser?');
-
- this.AudioContext = window.AudioContext || window.webkitAudioContext;
- if (!this.AudioContext) throw new Error('Akko could not find `AudioContext`! Is it supported in your browser?');
-
- this.options = mergeOptions(options);
-
- this.container = document.getElementById(this.options.containerId);
- if (!this.container) throw new Error('Could not find element with ID \'' + this.options.containerId + '\'!');
-
- this.musicPlayer = new MusicPlayer({
- audioContext: new this.AudioContext(),
- autoPlay: options.autoPlay
- });
- this.visCore = new VisualisationCore({
- parentElement: this.container,
- useDefaultVisualisers: this.options.useDefaultVisualisers,
- analyser: this.musicPlayer.getAnalyser()
- });
- }
+/***/ }),
- _createClass(Akko, [{
- key: 'start',
- value: function start() {
- this.bootstrapUI();
- this.visCore.prepare();
- this.visCore.useVisualiser(0);
- this.musicPlayer.start();
- this.visCore.start();
- this.setupListeners();
- }
- }, {
- key: 'bootstrapUI',
- value: function bootstrapUI() {
- this.ui = new UI({
- container: this.container,
- musicPlayer: this.musicPlayer,
- visCore: this.visCore
- });
- this.ui.start();
- }
+/***/ "./lib/visualisers/BarVisualiser.js":
+/*!******************************************!*\
+ !*** ./lib/visualisers/BarVisualiser.js ***!
+ \******************************************/
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
- /**
- * @param {Visualiser} visualiser
- */
+eval("{function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }\nfunction _possibleConstructorReturn(t, e) { if (e && (\"object\" == _typeof(e) || \"function\" == typeof e)) return e; if (void 0 !== e) throw new TypeError(\"Derived constructors may only return object or undefined\"); return _assertThisInitialized(t); }\nfunction _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); return e; }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\nfunction _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }\nfunction _inherits(t, e) { if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, \"prototype\", { writable: !1 }), e && _setPrototypeOf(t, e); }\nfunction _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }\n/**\n * @author Timur Kuzhagaliyev \n * @copyright 2017\n * @license GPL-3.0\n */\n\nvar Visualiser = __webpack_require__(/*! ../Visualiser */ \"./lib/Visualiser.js\");\nvar BAR_COUNT = 32;\nvar BarVisualiser = /*#__PURE__*/function (_Visualiser) {\n function BarVisualiser() {\n _classCallCheck(this, BarVisualiser);\n return _callSuper(this, BarVisualiser, [{\n code: 'Ba',\n name: 'Bars 3D',\n fftSize: BAR_COUNT * 2,\n smoothingTimeConstant: 0.9\n }]);\n }\n _inherits(BarVisualiser, _Visualiser);\n return _createClass(BarVisualiser, [{\n key: \"onInit\",\n value: function onInit(data) {\n this.setupSceneAndCamera(data);\n this.setupLights(data);\n this.setupPlane(data);\n this.setupBars(data);\n }\n }, {\n key: \"setupSceneAndCamera\",\n value: function setupSceneAndCamera(data) {\n this.scene = new THREE.Scene();\n this.camera = new THREE.PerspectiveCamera(60, data.width / data.height, 0.1, 100);\n this.camera.position.set(0, 15, 17);\n this.camera.rotation.x = -Math.PI / 4;\n this.cameraPivot = new THREE.Object3D();\n this.cameraPivot.add(this.camera);\n this.cameraPivot.castShadow = true;\n this.scene.add(this.cameraPivot);\n }\n }, {\n key: \"setupLights\",\n value: function setupLights() {\n var ambientLight = new THREE.AmbientLight(0x404040, 0.8);\n this.scene.add(ambientLight);\n }\n }, {\n key: \"setupPlane\",\n value: function setupPlane() {\n var planeGeometry = new THREE.PlaneGeometry(200, 200, 1);\n var planeMaterial = new THREE.MeshPhongMaterial({\n color: 0x444444,\n side: THREE.DoubleSide\n });\n var plane = new THREE.Mesh(planeGeometry, planeMaterial);\n plane.receiveShadow = true;\n plane.rotation.x = Math.PI / 2;\n this.scene.add(plane);\n }\n }, {\n key: \"setupBars\",\n value: function setupBars() {\n this.bars = [];\n this.lights = [];\n this.cubeLights = [];\n var step = 2 * Math.PI / BAR_COUNT;\n var geometry = new THREE.BoxGeometry(0.5, 10, 0.5);\n var radius = 5;\n for (var i = 0; i < BAR_COUNT; i++) {\n var color = 0xff0000 + i * 5;\n var bar = new THREE.Object3D();\n var material = new THREE.MeshLambertMaterial({\n color: color\n });\n var cube = new THREE.Mesh(geometry, material);\n var cubeLight = new THREE.PointLight(color, 0, 4);\n cubeLight.position.y = 7;\n cubeLight.position.x = -1;\n cube.add(cubeLight);\n var light = new THREE.PointLight(color, 0, 10);\n light.position.y = 1;\n light.position.x = 10;\n bar.add(light);\n bar.add(cube);\n bar.position.x = radius;\n cube.position.y = -4.8;\n var pivot = new THREE.Object3D();\n pivot.rotation.y = step * i;\n pivot.add(bar);\n this.scene.add(pivot);\n this.bars.push(cube);\n this.lights.push(light);\n this.cubeLights.push(cubeLight);\n }\n }\n }, {\n key: \"onUpdate\",\n value: function onUpdate(data) {\n for (var i = 0; i < BAR_COUNT; i++) {\n var bar = this.bars[i];\n var light = this.lights[i];\n var cubeLight = this.cubeLights[i];\n var frequency = Math.abs(data.frequencyData[i]);\n var timeDomain = data.timeDomainData[i];\n var value = frequency * timeDomain;\n if (value === Infinity || value === -Infinity) continue;\n var newY = bar.position.y + (value - bar.position.y) / 30;\n if (isNaN(newY)) continue;\n light.intensity = Math.max(0, newY);\n cubeLight.intensity = Math.max(0, newY) * 0.5;\n bar.position.y = newY;\n }\n this.cameraPivot.rotation.y += 0.01;\n data.renderer.render(this.scene, this.camera);\n }\n }, {\n key: \"onResize\",\n value: function onResize(data) {\n this.camera.aspect = data.width / data.height;\n this.camera.updateProjectionMatrix();\n }\n }, {\n key: \"onDestroy\",\n value: function onDestroy() {\n delete this.scene;\n delete this.camera;\n }\n }]);\n}(Visualiser);\nmodule.exports = BarVisualiser;\n\n//# sourceURL=webpack://Akko/./lib/visualisers/BarVisualiser.js?\n}");
- }, {
- key: 'addVisualiser',
- value: function addVisualiser(visualiser) {
- this.visCore.addVisualiser(visualiser);
- }
+/***/ }),
- /**
- * @param {string|File|ArrayBuffer} source
- * @param {string} [title]
- */
+/***/ "./lib/visualisers/ES12ParticleSwarmVisualiser.js":
+/*!********************************************************!*\
+ !*** ./lib/visualisers/ES12ParticleSwarmVisualiser.js ***!
+ \********************************************************/
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
- }, {
- key: 'addTrack',
- value: function addTrack(source, title) {
- this.musicPlayer.addTrack(source, title);
- }
+eval("{function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }\nfunction _possibleConstructorReturn(t, e) { if (e && (\"object\" == _typeof(e) || \"function\" == typeof e)) return e; if (void 0 !== e) throw new TypeError(\"Derived constructors may only return object or undefined\"); return _assertThisInitialized(t); }\nfunction _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); return e; }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\nfunction _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }\nfunction _inherits(t, e) { if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, \"prototype\", { writable: !1 }), e && _setPrototypeOf(t, e); }\nfunction _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }\nfunction _classPrivateMethodInitSpec(e, a) { _checkPrivateRedeclaration(e, a), a.add(e); }\nfunction _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }\nfunction _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError(\"Cannot initialize the same private elements twice on an object\"); }\nfunction _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; }\nfunction _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); }\nfunction _assertClassBrand(e, t, n) { if (\"function\" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError(\"Private element is not present on this object\"); }\n/**\n * ES12+ Particle Swarm Visualiser for Akko Framework\n * Showcases modern JavaScript features while providing stunning audio-reactive visuals\n * \n * Features:\n * - Private fields and methods (ES2022)\n * - Optional chaining and nullish coalescing (ES2020)\n * - Interactive controls with multiple particle styles\n * - 5 color schemes with audio-reactive effects\n * - Explosion effects triggered by audio spikes\n */\n\nvar Visualiser = __webpack_require__(/*! ../Visualiser */ \"./lib/Visualiser.js\");\nvar _particleSystem = /*#__PURE__*/new WeakMap();\nvar _time = /*#__PURE__*/new WeakMap();\nvar _particleCount = /*#__PURE__*/new WeakMap();\nvar _particleStyle = /*#__PURE__*/new WeakMap();\nvar _colorScheme = /*#__PURE__*/new WeakMap();\nvar _controlsCreated = /*#__PURE__*/new WeakMap();\nvar _isActive = /*#__PURE__*/new WeakMap();\nvar _lastBassLevel = /*#__PURE__*/new WeakMap();\nvar _lastTrebleLevel = /*#__PURE__*/new WeakMap();\nvar _explosionTrigger = /*#__PURE__*/new WeakMap();\nvar _ES12ParticleSwarmVisualiser_brand = /*#__PURE__*/new WeakSet();\nvar ES12ParticleSwarmVisualiser = /*#__PURE__*/function (_Visualiser) {\n function ES12ParticleSwarmVisualiser() {\n var _this;\n _classCallCheck(this, ES12ParticleSwarmVisualiser);\n _this = _callSuper(this, ES12ParticleSwarmVisualiser, [{\n code: 'PSW',\n name: 'ES12+ Particle Swarm',\n fftSize: 256,\n smoothingTimeConstant: 0.8\n }]);\n\n // Add to instances tracking with modern syntax\n // Private method using ES12+ features\n _classPrivateMethodInitSpec(_this, _ES12ParticleSwarmVisualiser_brand);\n // Private fields (ES2022)\n _classPrivateFieldInitSpec(_this, _particleSystem, null);\n _classPrivateFieldInitSpec(_this, _time, 0);\n _classPrivateFieldInitSpec(_this, _particleCount, 1000);\n _classPrivateFieldInitSpec(_this, _particleStyle, 'points');\n // 'points', 'cubes', 'spheres'\n _classPrivateFieldInitSpec(_this, _colorScheme, 'rainbow');\n // 'rainbow', 'fire', 'ocean', 'neon', 'cyber'\n _classPrivateFieldInitSpec(_this, _controlsCreated, false);\n _classPrivateFieldInitSpec(_this, _isActive, false);\n _classPrivateFieldInitSpec(_this, _lastBassLevel, 0);\n _classPrivateFieldInitSpec(_this, _lastTrebleLevel, 0);\n _classPrivateFieldInitSpec(_this, _explosionTrigger, 0);\n _instances._.add(_this);\n console.log('🌟 ES12+ Particle Swarm visualizer created');\n return _this;\n }\n\n // Akko lifecycle method with ES12+ features\n _inherits(ES12ParticleSwarmVisualiser, _Visualiser);\n return _createClass(ES12ParticleSwarmVisualiser, [{\n key: \"onInit\",\n value: function onInit(data) {\n console.log('🚀 ES12+ Particle Swarm initializing...');\n\n // Setup scene with optional chaining\n this.scene = new THREE.Scene();\n this.camera = new THREE.PerspectiveCamera(75, data.width / data.height, 0.1, 1000);\n this.camera.position.z = 50;\n\n // Create particles with modern array methods\n _assertClassBrand(_ES12ParticleSwarmVisualiser_brand, this, _createParticleSystem).call(this);\n }\n }, {\n key: \"onUpdate\",\n value:\n // Akko update method with ES12+ features\n function onUpdate(data) {\n // Early return with nullish coalescing\n if (!_classPrivateFieldGet(_particleSystem, this) || !(data !== null && data !== void 0 && data.frequencyData)) return;\n _classPrivateFieldSet(_time, this, _classPrivateFieldGet(_time, this) + 0.016);\n\n // Destructuring with default values\n var _ref = data.frequencyData[0] / 255,\n bass = _ref === void 0 ? 0 : _ref,\n _ref2 = data.frequencyData[Math.floor(data.frequencyData.length / 2)] / 255,\n mid = _ref2 === void 0 ? 0 : _ref2,\n _ref3 = data.frequencyData[data.frequencyData.length - 1] / 255,\n treble = _ref3 === void 0 ? 0 : _ref3;\n\n // Update particles with modern syntax\n _assertClassBrand(_ES12ParticleSwarmVisualiser_brand, this, _updateParticles).call(this, bass, mid, treble, data);\n\n // Rotation with nullish coalescing\n _classPrivateFieldGet(_particleSystem, this).rotation.y += 0.008 * (bass + 0.1);\n _classPrivateFieldGet(_particleSystem, this).rotation.x += 0.003 * (treble + 0.05);\n\n // Render with proper null checking\n if (data.renderer && this.scene && this.camera) {\n data.renderer.render(this.scene, this.camera);\n }\n }\n\n // Private update method\n }, {\n key: \"onResize\",\n value:\n // Akko resize method\n function onResize(data) {\n this.camera.aspect = data.width / data.height;\n this.camera.updateProjectionMatrix();\n console.log(\"\\uD83D\\uDCD0 ES12+ Particle Swarm resized to \".concat(data.width, \"x\").concat(data.height));\n }\n\n // Akko destroy method with cleanup\n }, {\n key: \"onDestroy\",\n value: function onDestroy() {\n var _this$scene;\n _instances._[\"delete\"](this);\n if (_classPrivateFieldGet(_particleStyle, this) === 'points') {\n var _classPrivateFieldGet2, _classPrivateFieldGet3;\n (_classPrivateFieldGet2 = _classPrivateFieldGet(_particleSystem, this)) === null || _classPrivateFieldGet2 === void 0 || (_classPrivateFieldGet2 = _classPrivateFieldGet2.geometry) === null || _classPrivateFieldGet2 === void 0 || _classPrivateFieldGet2.dispose();\n (_classPrivateFieldGet3 = _classPrivateFieldGet(_particleSystem, this)) === null || _classPrivateFieldGet3 === void 0 || (_classPrivateFieldGet3 = _classPrivateFieldGet3.material) === null || _classPrivateFieldGet3 === void 0 || _classPrivateFieldGet3.dispose();\n } else {\n var _classPrivateFieldGet4;\n // Clean up mesh particles\n (_classPrivateFieldGet4 = _classPrivateFieldGet(_particleSystem, this)) === null || _classPrivateFieldGet4 === void 0 || (_classPrivateFieldGet4 = _classPrivateFieldGet4.children) === null || _classPrivateFieldGet4 === void 0 || _classPrivateFieldGet4.forEach(function (mesh) {\n var _mesh$geometry, _mesh$material;\n (_mesh$geometry = mesh.geometry) === null || _mesh$geometry === void 0 || _mesh$geometry.dispose();\n (_mesh$material = mesh.material) === null || _mesh$material === void 0 || _mesh$material.dispose();\n });\n }\n (_this$scene = this.scene) === null || _this$scene === void 0 || _this$scene.remove(_classPrivateFieldGet(_particleSystem, this));\n\n // Clear references\n delete this.scene;\n delete this.camera;\n delete this.velocities;\n _classPrivateFieldSet(_particleSystem, this, null);\n console.log('🗑️ ES12+ Particle Swarm destroyed');\n }\n\n // Static method to get instance count\n }, {\n key: \"setParticleStyle\",\n value:\n // Public API methods for external control\n function setParticleStyle(style) {\n if (['points', 'cubes', 'spheres'].includes(style)) {\n _classPrivateFieldSet(_particleStyle, this, style);\n _assertClassBrand(_ES12ParticleSwarmVisualiser_brand, this, _recreateParticles).call(this);\n }\n }\n }, {\n key: \"setColorScheme\",\n value: function setColorScheme(scheme) {\n if (['rainbow', 'fire', 'ocean', 'neon', 'cyber'].includes(scheme)) {\n _classPrivateFieldSet(_colorScheme, this, scheme);\n }\n }\n }, {\n key: \"setParticleCount\",\n value: function setParticleCount(count) {\n if (count >= 100 && count <= 2000) {\n _classPrivateFieldSet(_particleCount, this, count);\n _assertClassBrand(_ES12ParticleSwarmVisualiser_brand, this, _recreateParticles).call(this);\n }\n }\n\n // Recreate particles with new settings\n }], [{\n key: \"getInstanceCount\",\n value: function getInstanceCount() {\n return _assertClassBrand(ES12ParticleSwarmVisualiser, this, _instances)._.size;\n }\n }]);\n}(Visualiser); // Export for use in other projects\nfunction _createParticleSystem() {\n var _this$scene2;\n var geometry = new THREE.BufferGeometry();\n var positions = new Float32Array(_classPrivateFieldGet(_particleCount, this) * 3);\n var colors = new Float32Array(_classPrivateFieldGet(_particleCount, this) * 3);\n var velocities = new Float32Array(_classPrivateFieldGet(_particleCount, this) * 3);\n\n // Initialize particles with safe random values\n for (var i = 0; i < _classPrivateFieldGet(_particleCount, this); i++) {\n var i3 = i * 3;\n\n // Safe random position generation\n var x = (Math.random() - 0.5) * 100;\n var y = (Math.random() - 0.5) * 100;\n var z = (Math.random() - 0.5) * 100;\n\n // Bright futuristic color palette - ensure visible colors\n var r = 0.5 + Math.random() * 0.5;\n var g = 0.5 + Math.random() * 0.5;\n var b = 0.5 + Math.random() * 0.5;\n\n // Safe velocity generation\n var vx = (Math.random() - 0.5) * 2;\n var vy = (Math.random() - 0.5) * 2;\n var vz = (Math.random() - 0.5) * 2;\n\n // Safe assignment\n positions[i3] = x;\n positions[i3 + 1] = y;\n positions[i3 + 2] = z;\n colors[i3] = r;\n colors[i3 + 1] = g;\n colors[i3 + 2] = b;\n velocities[i3] = vx;\n velocities[i3 + 1] = vy;\n velocities[i3 + 2] = vz;\n }\n geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));\n geometry.setAttribute('color', new THREE.BufferAttribute(colors, 3));\n\n // Store velocities for animation\n this.velocities = velocities;\n\n // Create different particle types based on style\n if (_classPrivateFieldGet(_particleStyle, this) === 'cubes') {\n _assertClassBrand(_ES12ParticleSwarmVisualiser_brand, this, _createCubeParticles).call(this, geometry);\n } else if (_classPrivateFieldGet(_particleStyle, this) === 'spheres') {\n _assertClassBrand(_ES12ParticleSwarmVisualiser_brand, this, _createSphereParticles).call(this, geometry);\n } else {\n // Default points with modern object shorthand\n var materialConfig = {\n size: 4,\n vertexColors: true,\n transparent: true,\n opacity: 0.95,\n blending: THREE.AdditiveBlending,\n sizeAttenuation: true\n };\n var material = new THREE.PointsMaterial(materialConfig);\n _classPrivateFieldSet(_particleSystem, this, new THREE.Points(geometry, material));\n }\n (_this$scene2 = this.scene) === null || _this$scene2 === void 0 || _this$scene2.add(_classPrivateFieldGet(_particleSystem, this));\n}\n// Create cube-based particles\nfunction _createCubeParticles(geometry) {\n var group = new THREE.Group();\n var positions = geometry.attributes.position.array;\n var colors = geometry.attributes.color.array;\n for (var i = 0; i < _classPrivateFieldGet(_particleCount, this); i++) {\n var i3 = i * 3;\n var cubeGeometry = new THREE.BoxGeometry(1.5, 1.5, 1.5);\n var cubeMaterial = new THREE.MeshBasicMaterial({\n color: new THREE.Color(colors[i3], colors[i3 + 1], colors[i3 + 2]),\n transparent: true,\n opacity: 0.8,\n wireframe: Math.random() > 0.7 // Some wireframe cubes for variety\n });\n var cube = new THREE.Mesh(cubeGeometry, cubeMaterial);\n cube.position.set(positions[i3], positions[i3 + 1], positions[i3 + 2]);\n\n // Store velocity data on cube for updates\n cube.userData = {\n velocityIndex: i3\n };\n group.add(cube);\n }\n _classPrivateFieldSet(_particleSystem, this, group);\n}\n// Create sphere-based particles\nfunction _createSphereParticles(geometry) {\n var group = new THREE.Group();\n var positions = geometry.attributes.position.array;\n var colors = geometry.attributes.color.array;\n for (var i = 0; i < _classPrivateFieldGet(_particleCount, this); i++) {\n var i3 = i * 3;\n var sphereGeometry = new THREE.SphereGeometry(1.0, 12, 12);\n var sphereMaterial = new THREE.MeshBasicMaterial({\n color: new THREE.Color(colors[i3], colors[i3 + 1], colors[i3 + 2]),\n transparent: true,\n opacity: 0.9,\n wireframe: Math.random() > 0.8 // Some wireframe spheres\n });\n var sphere = new THREE.Mesh(sphereGeometry, sphereMaterial);\n sphere.position.set(positions[i3], positions[i3 + 1], positions[i3 + 2]);\n group.add(sphere);\n }\n _classPrivateFieldSet(_particleSystem, this, group);\n}\n// Get color based on scheme and audio data\nfunction _getAudioReactiveColor(audioLevel, bass, mid, treble) {\n var hueBase = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;\n var color = {\n r: 0.5,\n g: 0.5,\n b: 0.5\n };\n switch (_classPrivateFieldGet(_colorScheme, this)) {\n case 'fire':\n color = {\n r: 0.8 + audioLevel * 0.2,\n g: 0.3 + bass * 0.5,\n b: 0.1 + treble * 0.2\n };\n break;\n case 'ocean':\n color = {\n r: 0.1 + treble * 0.3,\n g: 0.4 + mid * 0.4,\n b: 0.7 + audioLevel * 0.3\n };\n break;\n case 'neon':\n color = {\n r: 0.9 + Math.sin(_classPrivateFieldGet(_time, this) + hueBase) * 0.1,\n g: 0.1 + audioLevel * 0.8,\n b: 0.9 + Math.cos(_classPrivateFieldGet(_time, this) + hueBase) * 0.1\n };\n break;\n case 'cyber':\n color = {\n r: 0.1 + bass * 0.4,\n g: 0.8 + audioLevel * 0.2,\n b: 0.9 + treble * 0.1\n };\n break;\n default:\n // rainbow\n var hue = (hueBase + _classPrivateFieldGet(_time, this) * 0.1 + audioLevel) % 1;\n var tempColor = new THREE.Color().setHSL(hue, 0.8 + audioLevel * 0.2, 0.6 + audioLevel * 0.4);\n color = {\n r: tempColor.r,\n g: tempColor.g,\n b: tempColor.b\n };\n }\n return color;\n}\nfunction _updateParticles(bass, mid, treble, data) {\n // Handle different particle types\n if (_classPrivateFieldGet(_particleStyle, this) === 'points') {\n _assertClassBrand(_ES12ParticleSwarmVisualiser_brand, this, _updatePointParticles).call(this, bass, mid, treble, data);\n } else {\n _assertClassBrand(_ES12ParticleSwarmVisualiser_brand, this, _updateMeshParticles).call(this, bass, mid, treble, data);\n }\n}\n// Update point-based particles\nfunction _updatePointParticles(bass, mid, treble, data) {\n var _this2 = this;\n var positions = _classPrivateFieldGet(_particleSystem, this).geometry.attributes.position.array;\n var colors = _classPrivateFieldGet(_particleSystem, this).geometry.attributes.color.array;\n\n // Swarm center with object shorthand\n var swarmCenter = {\n x: Math.sin(_classPrivateFieldGet(_time, this) * 0.5) * 40 * (bass || 0.1),\n y: Math.cos(_classPrivateFieldGet(_time, this) * 0.3) * 40 * (mid || 0.1),\n z: Math.sin(_classPrivateFieldGet(_time, this) * 0.7) * 40 * (treble || 0.1)\n };\n\n // Modern for loop with array methods\n Array.from({\n length: _classPrivateFieldGet(_particleCount, this)\n }, function (_, i) {\n var _ref5, _data$frequencyData;\n var i3 = i * 3;\n\n // Destructuring assignment\n var _ref4 = [positions[i3], positions[i3 + 1], positions[i3 + 2]],\n x = _ref4[0],\n y = _ref4[1],\n z = _ref4[2];\n\n // Calculate force with safe math\n var dx = swarmCenter.x - x;\n var dy = swarmCenter.y - y;\n var dz = swarmCenter.z - z;\n var distance = Math.sqrt(dx * dx + dy * dy + dz * dz);\n var force = 0.03 * (bass + 0.1);\n if (distance > 0.001) {\n // Avoid division by very small numbers\n // Safe force calculation\n var forceX = dx / distance * force;\n var forceY = dy / distance * force;\n var forceZ = dz / distance * force;\n\n // Update velocities with safety checks\n if (isFinite(forceX)) _this2.velocities[i3] += forceX;\n if (isFinite(forceY)) _this2.velocities[i3 + 1] += forceY;\n if (isFinite(forceZ)) _this2.velocities[i3 + 2] += forceZ;\n }\n\n // Apply damping and update positions with safety checks\n _this2.velocities[i3] *= 0.98;\n _this2.velocities[i3 + 1] *= 0.98;\n _this2.velocities[i3 + 2] *= 0.98;\n\n // Update positions with bounds checking\n if (isFinite(_this2.velocities[i3])) positions[i3] += _this2.velocities[i3];\n if (isFinite(_this2.velocities[i3 + 1])) positions[i3 + 1] += _this2.velocities[i3 + 1];\n if (isFinite(_this2.velocities[i3 + 2])) positions[i3 + 2] += _this2.velocities[i3 + 2];\n\n // Keep particles within reasonable bounds\n positions[i3] = Math.max(-200, Math.min(200, positions[i3]));\n positions[i3 + 1] = Math.max(-200, Math.min(200, positions[i3 + 1]));\n positions[i3 + 2] = Math.max(-200, Math.min(200, positions[i3 + 2]));\n\n // Audio-reactive color scheme\n var audioIndex = Math.floor(i / _classPrivateFieldGet(_particleCount, _this2) * data.frequencyData.length);\n var audioLevel = (_ref5 = ((_data$frequencyData = data.frequencyData) === null || _data$frequencyData === void 0 ? void 0 : _data$frequencyData[audioIndex]) / 255) !== null && _ref5 !== void 0 ? _ref5 : 0;\n var hueBase = i / _classPrivateFieldGet(_particleCount, _this2);\n var brightColor = _assertClassBrand(_ES12ParticleSwarmVisualiser_brand, _this2, _getAudioReactiveColor).call(_this2, audioLevel, bass, mid, treble, hueBase);\n var colorMultipliers = [brightColor.r, brightColor.g, brightColor.b];\n colorMultipliers.forEach(function (multiplier, idx) {\n colors[i3 + idx] = multiplier;\n });\n });\n\n // Update geometry\n _classPrivateFieldGet(_particleSystem, this).geometry.attributes.position.needsUpdate = true;\n _classPrivateFieldGet(_particleSystem, this).geometry.attributes.color.needsUpdate = true;\n}\n// Update mesh-based particles (cubes/spheres)\nfunction _updateMeshParticles(bass, mid, treble, data) {\n var _this3 = this;\n if (!_classPrivateFieldGet(_particleSystem, this).children) return;\n\n // Detect audio spikes for explosive effects\n var bassSpike = bass > _classPrivateFieldGet(_lastBassLevel, this) + 0.3;\n var trebleSpike = treble > _classPrivateFieldGet(_lastTrebleLevel, this) + 0.2;\n if (bassSpike || trebleSpike) {\n _classPrivateFieldSet(_explosionTrigger, this, 1.0); // Trigger explosion effect\n }\n _classPrivateFieldSet(_explosionTrigger, this, _classPrivateFieldGet(_explosionTrigger, this) * 0.95); // Decay explosion effect\n _classPrivateFieldSet(_lastBassLevel, this, bass);\n _classPrivateFieldSet(_lastTrebleLevel, this, treble);\n _classPrivateFieldGet(_particleSystem, this).children.forEach(function (mesh, i) {\n var _ref7, _data$frequencyData2;\n var i3 = i * 3;\n\n // Get current position\n var _ref6 = [mesh.position.x, mesh.position.y, mesh.position.z],\n x = _ref6[0],\n y = _ref6[1],\n z = _ref6[2];\n\n // Calculate swarm center\n var swarmCenter = {\n x: Math.sin(_classPrivateFieldGet(_time, _this3) * 0.5) * 40 * (bass || 0.1),\n y: Math.cos(_classPrivateFieldGet(_time, _this3) * 0.3) * 40 * (mid || 0.1),\n z: Math.sin(_classPrivateFieldGet(_time, _this3) * 0.7) * 40 * (treble || 0.1)\n };\n\n // Calculate force with safe math\n var dx = swarmCenter.x - x;\n var dy = swarmCenter.y - y;\n var dz = swarmCenter.z - z;\n var distance = Math.sqrt(dx * dx + dy * dy + dz * dz);\n var force = 0.03 * (bass + 0.1);\n if (distance > 0) {\n var forceVector = [(swarmCenter.x - x) / distance * force, (swarmCenter.y - y) / distance * force, (swarmCenter.z - z) / distance * force];\n\n // Update velocities\n _this3.velocities[i3] += forceVector[0];\n _this3.velocities[i3 + 1] += forceVector[1];\n _this3.velocities[i3 + 2] += forceVector[2];\n }\n\n // Apply damping and update positions\n _this3.velocities[i3] *= 0.98;\n _this3.velocities[i3 + 1] *= 0.98;\n _this3.velocities[i3 + 2] *= 0.98;\n mesh.position.x += _this3.velocities[i3];\n mesh.position.y += _this3.velocities[i3 + 1];\n mesh.position.z += _this3.velocities[i3 + 2];\n\n // Audio-reactive effects\n var audioIndex = Math.floor(i / _classPrivateFieldGet(_particleSystem, _this3).children.length * data.frequencyData.length);\n var audioLevel = (_ref7 = ((_data$frequencyData2 = data.frequencyData) === null || _data$frequencyData2 === void 0 ? void 0 : _data$frequencyData2[audioIndex]) / 255) !== null && _ref7 !== void 0 ? _ref7 : 0;\n var bassBoost = bass * 3;\n var trebleBoost = treble * 2;\n var midBoost = mid * 2.5;\n\n // Fixed scaling - ensure visibility while keeping reactivity\n var baseScale = 1.0;\n var audioScale = audioLevel * 2;\n var bassScale = bassBoost * 1.5;\n var explosionScale = _classPrivateFieldGet(_explosionTrigger, _this3) * 2;\n var pulseScale = Math.sin(_classPrivateFieldGet(_time, _this3) * 8 + i * 0.2) * audioLevel * 0.3;\n var finalScale = baseScale + audioScale + bassScale + explosionScale + pulseScale;\n mesh.scale.setScalar(Math.max(0.5, Math.min(finalScale, 5)));\n\n // Smooth audio-reactive rotation\n mesh.rotation.x += audioLevel * 0.1 + bassBoost * 0.05;\n mesh.rotation.y += bassBoost * 0.1 + midBoost * 0.08;\n mesh.rotation.z += trebleBoost * 0.12 + audioLevel * 0.06;\n\n // Controlled audio-reactive movement\n var jitterAmount = audioLevel * 0.5;\n var explosionForce = _classPrivateFieldGet(_explosionTrigger, _this3) * 2;\n\n // Gentle explosion effect\n if (_classPrivateFieldGet(_explosionTrigger, _this3) > 0.3) {\n var explosionDirection = new THREE.Vector3((Math.random() - 0.5) * 0.5, (Math.random() - 0.5) * 0.5, (Math.random() - 0.5) * 0.5);\n mesh.position.add(explosionDirection.multiplyScalar(explosionForce));\n }\n\n // Subtle audio jitter\n mesh.position.x += (Math.random() - 0.5) * jitterAmount;\n mesh.position.y += (Math.random() - 0.5) * jitterAmount;\n mesh.position.z += (Math.random() - 0.5) * jitterAmount;\n\n // Update colors - audio-reactive with color schemes\n var hueBase = i / _classPrivateFieldGet(_particleSystem, _this3).children.length;\n var brightColor = _assertClassBrand(_ES12ParticleSwarmVisualiser_brand, _this3, _getAudioReactiveColor).call(_this3, audioLevel, bass, mid, treble, hueBase);\n mesh.material.color.setRGB(brightColor.r, brightColor.g, brightColor.b);\n\n // Opacity flashing with treble\n mesh.material.opacity = 0.6 + trebleBoost * 0.4 + Math.sin(_classPrivateFieldGet(_time, _this3) * 15) * audioLevel * 0.3;\n });\n}\nfunction _recreateParticles() {\n if (_classPrivateFieldGet(_particleSystem, this)) {\n var _this$scene3;\n (_this$scene3 = this.scene) === null || _this$scene3 === void 0 || _this$scene3.remove(_classPrivateFieldGet(_particleSystem, this));\n if (_classPrivateFieldGet(_particleStyle, this) === 'points') {\n var _classPrivateFieldGet5, _classPrivateFieldGet6;\n (_classPrivateFieldGet5 = _classPrivateFieldGet(_particleSystem, this)) === null || _classPrivateFieldGet5 === void 0 || (_classPrivateFieldGet5 = _classPrivateFieldGet5.geometry) === null || _classPrivateFieldGet5 === void 0 || _classPrivateFieldGet5.dispose();\n (_classPrivateFieldGet6 = _classPrivateFieldGet(_particleSystem, this)) === null || _classPrivateFieldGet6 === void 0 || (_classPrivateFieldGet6 = _classPrivateFieldGet6.material) === null || _classPrivateFieldGet6 === void 0 || _classPrivateFieldGet6.dispose();\n } else {\n var _classPrivateFieldGet7;\n (_classPrivateFieldGet7 = _classPrivateFieldGet(_particleSystem, this)) === null || _classPrivateFieldGet7 === void 0 || (_classPrivateFieldGet7 = _classPrivateFieldGet7.children) === null || _classPrivateFieldGet7 === void 0 || _classPrivateFieldGet7.forEach(function (mesh) {\n var _mesh$geometry2, _mesh$material2;\n (_mesh$geometry2 = mesh.geometry) === null || _mesh$geometry2 === void 0 || _mesh$geometry2.dispose();\n (_mesh$material2 = mesh.material) === null || _mesh$material2 === void 0 || _mesh$material2.dispose();\n });\n }\n }\n _assertClassBrand(_ES12ParticleSwarmVisualiser_brand, this, _createParticleSystem).call(this);\n}\n// Static private field for tracking instances\nvar _instances = {\n _: new Set()\n};\nif ( true && module.exports) {\n module.exports = ES12ParticleSwarmVisualiser;\n}\n\n//# sourceURL=webpack://Akko/./lib/visualisers/ES12ParticleSwarmVisualiser.js?\n}");
- /**
- * @private
- */
+/***/ }),
- }, {
- key: 'setupListeners',
- value: function setupListeners() {
- if (window.File && window.FileReader && window.FileList && window.Blob) {
- this.container.addEventListener('dragover', this.onDragOver.bind(this), false);
- this.container.addEventListener('drop', this.onDrop.bind(this), false);
- } else {
- console.warn('The File APIs are not fully supported your browser. Drag & drop disabled in Akko.');
- }
- }
+/***/ "./lib/visualisers/RingVisualiser.js":
+/*!*******************************************!*\
+ !*** ./lib/visualisers/RingVisualiser.js ***!
+ \*******************************************/
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
- /**
- * @private
- */
+eval("{function _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\"); }\nfunction _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }\nfunction _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", { writable: !1 }), e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }\nfunction _possibleConstructorReturn(t, e) { if (e && (\"object\" == _typeof(e) || \"function\" == typeof e)) return e; if (void 0 !== e) throw new TypeError(\"Derived constructors may only return object or undefined\"); return _assertThisInitialized(t); }\nfunction _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); return e; }\nfunction _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }\nfunction _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }\nfunction _inherits(t, e) { if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, \"prototype\", { writable: !1 }), e && _setPrototypeOf(t, e); }\nfunction _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }\n/**\n * @author Timur Kuzhagaliyev \n * @copyright 2017\n * @license GPL-3.0\n */\n\nvar RING_COUNT = 16;\nvar Visualiser = __webpack_require__(/*! ../Visualiser */ \"./lib/Visualiser.js\");\nvar RingVisualiser = /*#__PURE__*/function (_Visualiser) {\n function RingVisualiser() {\n _classCallCheck(this, RingVisualiser);\n return _callSuper(this, RingVisualiser, [{\n code: 'Rn',\n name: 'Rings 2D',\n fftSize: RING_COUNT * 2,\n smoothingTimeConstant: 0.9\n }]);\n }\n _inherits(RingVisualiser, _Visualiser);\n return _createClass(RingVisualiser, [{\n key: \"onInit\",\n value: function onInit(data) {\n this.setupSceneAndCamera(data);\n this.setupRings();\n }\n }, {\n key: \"setupSceneAndCamera\",\n value: function setupSceneAndCamera(data) {\n this.scene = new THREE.Scene();\n this.camera = new THREE.PerspectiveCamera(60, data.width / data.height, 0.1, 100);\n this.camera.position.z = 20;\n this.camera.lookAt(new THREE.Vector3(0, 0, 0));\n this.scene.add(this.camera);\n }\n }, {\n key: \"setupRings\",\n value: function setupRings() {\n this.rings = [];\n var hslStep = 1 / RING_COUNT;\n for (var i = 0; i < RING_COUNT; i++) {\n var radius = 2 + i;\n var segments = 64;\n var material = new THREE.LineBasicMaterial({\n color: 0x0000ff * i\n });\n material.color.setHSL(hslStep * i, 1, 0.5);\n var geometry = new THREE.CircleGeometry(radius, segments);\n var ring = new THREE.Line(geometry, material);\n this.scene.add(ring);\n this.rings.push(ring);\n }\n }\n }, {\n key: \"onUpdate\",\n value: function onUpdate(data) {\n for (var i = 0; i < RING_COUNT; i++) {\n var ring = this.rings[i];\n var timeDomain = data.timeDomainData[i];\n var frequency = Math.abs(data.frequencyData[i]);\n var scale = this.lerp(ring.scale.x, frequency * timeDomain, 0.01);\n scale = this.constrain(2, 0.5, scale);\n ring.scale.set(scale, scale, scale);\n ring.rotation.z += 0.002 * i;\n }\n data.renderer.render(this.scene, this.camera);\n }\n }, {\n key: \"onResize\",\n value: function onResize(data) {\n this.camera.aspect = data.width / data.height;\n this.camera.updateProjectionMatrix();\n }\n }, {\n key: \"onDestroy\",\n value: function onDestroy() {\n delete this.scene;\n delete this.camera;\n }\n }]);\n}(Visualiser);\nmodule.exports = RingVisualiser;\n\n//# sourceURL=webpack://Akko/./lib/visualisers/RingVisualiser.js?\n}");
- }, {
- key: 'onDragOver',
- value: function onDragOver(event) {
- event.stopPropagation();
- event.preventDefault();
- event.dataTransfer.dropEffect = 'copy';
- }
+/***/ }),
- /**
- * @private
- */
+/***/ "./lib/visualisers/index.js":
+/*!**********************************!*\
+ !*** ./lib/visualisers/index.js ***!
+ \**********************************/
+/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
- }, {
- key: 'onDrop',
- value: function onDrop(event) {
- event.stopPropagation();
- event.preventDefault();
- var files = event.dataTransfer.files;
+eval("{/**\n * @author Timur Kuzhagaliyev \n * @copyright 2017\n * @license GPL-3.0\n */\n\nmodule.exports = {\n BarVisualiser: __webpack_require__(/*! ./BarVisualiser */ \"./lib/visualisers/BarVisualiser.js\"),\n RingVisualiser: __webpack_require__(/*! ./RingVisualiser */ \"./lib/visualisers/RingVisualiser.js\"),\n ES12ParticleSwarmVisualiser: __webpack_require__(/*! ./ES12ParticleSwarmVisualiser */ \"./lib/visualisers/ES12ParticleSwarmVisualiser.js\")\n};\n\n//# sourceURL=webpack://Akko/./lib/visualisers/index.js?\n}");
- for (var i = 0; i < files.length; i++) {
- var file = files[i];
- if (file.type.match(/audio.*/)) {
- this.musicPlayer.addTrack(file);
- }
- }
- }
- }]);
+/***/ }),
- return Akko;
-}();
+/***/ "./node_modules/element-resize-event/index.js":
+/*!****************************************************!*\
+ !*** ./node_modules/element-resize-event/index.js ***!
+ \****************************************************/
+/***/ ((module) => {
-module.exports = Akko;
+eval("{var requestFrame = (function () {\n var window = this\n var raf = window.requestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n function fallbackRAF(func) {\n return window.setTimeout(func, 20)\n }\n return function requestFrameFunction(func) {\n return raf(func)\n }\n})()\n\nvar cancelFrame = (function () {\n var window = this\n var cancel = window.cancelAnimationFrame ||\n window.mozCancelAnimationFrame ||\n window.webkitCancelAnimationFrame ||\n window.clearTimeout\n return function cancelFrameFunction(id) {\n return cancel(id)\n }\n})()\n\nfunction resizeListener(e) {\n var win = e.target || e.srcElement\n if (win.__resizeRAF__) {\n cancelFrame(win.__resizeRAF__)\n }\n win.__resizeRAF__ = requestFrame(function () {\n var trigger = win.__resizeTrigger__\n trigger.__resizeListeners__.forEach(function (fn) {\n fn.call(trigger, e)\n })\n })\n}\n\nvar exports = function exports(element, fn) {\n var window = this\n var document = window.document\n var isIE\n\n var attachEvent = document.attachEvent\n if (typeof navigator !== 'undefined') {\n isIE = navigator.userAgent.match(/Trident/) ||\n navigator.userAgent.match(/Edge/)\n }\n\n function objectLoad() {\n this.contentDocument.defaultView.__resizeTrigger__ = this.__resizeElement__\n this.contentDocument.defaultView.addEventListener('resize', resizeListener)\n }\n\n if (!element.__resizeListeners__) {\n element.__resizeListeners__ = []\n if (attachEvent) {\n element.__resizeTrigger__ = element\n element.attachEvent('onresize', resizeListener)\n } else {\n if (getComputedStyle(element).position === 'static') {\n element.style.position = 'relative'\n }\n var obj = (element.__resizeTrigger__ = document.createElement('object'))\n obj.setAttribute(\n 'style',\n 'display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden; pointer-events: none; z-index: -1; opacity: 0;'\n )\n obj.setAttribute('class', 'resize-sensor')\n obj.__resizeElement__ = element\n obj.onload = objectLoad\n obj.type = 'text/html'\n if (isIE) {\n element.appendChild(obj)\n }\n obj.data = 'about:blank'\n if (!isIE) {\n element.appendChild(obj)\n }\n }\n }\n element.__resizeListeners__.push(fn)\n}\n\nmodule.exports = typeof window === 'undefined' ? exports : exports.bind(window)\n\nmodule.exports.unbind = function (element, fn) {\n var attachEvent = document.attachEvent\n if (fn) {\n element.__resizeListeners__.splice(\n element.__resizeListeners__.indexOf(fn),\n 1\n )\n } else {\n element.__resizeListeners__ = []\n }\n if (!element.__resizeListeners__.length) {\n if (attachEvent) {\n element.detachEvent('onresize', resizeListener)\n } else {\n element.__resizeTrigger__.contentDocument.defaultView.removeEventListener(\n 'resize',\n resizeListener\n )\n delete element.__resizeTrigger__.contentDocument.defaultView.__resizeTrigger__\n element.__resizeTrigger__ = !element.removeChild(\n element.__resizeTrigger__\n )\n }\n delete element.__resizeListeners__\n }\n}\n\n\n//# sourceURL=webpack://Akko/./node_modules/element-resize-event/index.js?\n}");
/***/ }),
-/* 10 */
-/***/ (function(module, exports) {
-
-module.exports = Promise;
-/***/ }),
-/* 11 */
-/***/ (function(module, exports, __webpack_require__) {
+/***/ "./node_modules/preact/dist/preact.mjs":
+/*!*********************************************!*\
+ !*** ./node_modules/preact/dist/preact.mjs ***!
+ \*********************************************/
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
"use strict";
-
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-/**
- * @author Timur Kuzhagaliyev
- * @copyright 2017
- * @license GPL-3.0
- */
-
-var SourceTypes = {
- URL: 'url',
- FILE: 'file',
- ARRAY_BUFFER: 'arrayBuffer'
-};
-
-var Track = function () {
-
- /**
- * @param {object} data
- * @param {string|File} data.source
- * @param {string} [data.title]
- */
- function Track(data) {
- _classCallCheck(this, Track);
-
- this.source = data.source;
- this.title = data.title;
- this.arrayBufferCache = null;
- this.analyseSource();
- }
-
- _createClass(Track, [{
- key: 'analyseSource',
- value: function analyseSource() {
- if (typeof this.source === 'string') {
- this.sourceType = SourceTypes.URL;
- this.title = this.title || decodeURIComponent(this.source.split('/').pop().replace(/\.[a-zA-Z0-9]+$/, ''));
- } else if (this.source instanceof File) {
- this.sourceType = SourceTypes.FILE;
- this.title = this.title || this.source.name.replace(/\.[a-zA-Z0-9]+$/, '');
- } else if (this.source instanceof ArrayBuffer) {
- this.sourceType = SourceTypes.ARRAY_BUFFER;
- this.title = this.title || 'Untitled';
- } else {
- throw new Error('\'Unsupported Track source type: ' + this.source);
- }
- }
-
- /**
- * @return {Promise.}
- */
-
- }, {
- key: 'prepareArrayBuffer',
- value: function prepareArrayBuffer() {
- var _this = this;
-
- if (this.arrayBufferCache) return Promise.resolve(this.arrayBufferCache);
- switch (this.sourceType) {
- case SourceTypes.URL:
- return window.fetch(this.source).then(function (response) {
- var arrayBuffer = response.arrayBuffer();
- _this.arrayBufferCache = arrayBuffer;
- return arrayBuffer;
- });
- case SourceTypes.FILE:
- return new Promise(function (resolve, reject) {
- var reader = new window.FileReader();
- reader.onload = function (fileEvent) {
- var arrayBuffer = fileEvent.target.result;
- _this.arrayBufferCache = arrayBuffer;
- resolve(arrayBuffer);
- };
- reader.onerror = function (error) {
- reject(error);
- };
- reader.readAsArrayBuffer(_this.source);
- });
- case SourceTypes.ARRAY_BUFFER:
- return Promise.resolve(this.source);
- default:
- return Promise.reject(new Error('\'Unsupported track source type: ' + this.sourceType));
- }
- }
- }]);
-
- return Track;
-}();
-
-module.exports = Track;
-module.exports.SourceTypes = SourceTypes;
+eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Component: () => (/* binding */ Component),\n/* harmony export */ cloneElement: () => (/* binding */ cloneElement),\n/* harmony export */ createElement: () => (/* binding */ h),\n/* harmony export */ createRef: () => (/* binding */ createRef),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */ h: () => (/* binding */ h),\n/* harmony export */ options: () => (/* binding */ options),\n/* harmony export */ render: () => (/* binding */ render),\n/* harmony export */ rerender: () => (/* binding */ rerender)\n/* harmony export */ });\nvar VNode = function VNode() {};\n\nvar options = {};\n\nvar stack = [];\n\nvar EMPTY_CHILDREN = [];\n\nfunction h(nodeName, attributes) {\n\tvar children = EMPTY_CHILDREN,\n\t lastSimple,\n\t child,\n\t simple,\n\t i;\n\tfor (i = arguments.length; i-- > 2;) {\n\t\tstack.push(arguments[i]);\n\t}\n\tif (attributes && attributes.children != null) {\n\t\tif (!stack.length) stack.push(attributes.children);\n\t\tdelete attributes.children;\n\t}\n\twhile (stack.length) {\n\t\tif ((child = stack.pop()) && child.pop !== undefined) {\n\t\t\tfor (i = child.length; i--;) {\n\t\t\t\tstack.push(child[i]);\n\t\t\t}\n\t\t} else {\n\t\t\tif (typeof child === 'boolean') child = null;\n\n\t\t\tif (simple = typeof nodeName !== 'function') {\n\t\t\t\tif (child == null) child = '';else if (typeof child === 'number') child = String(child);else if (typeof child !== 'string') simple = false;\n\t\t\t}\n\n\t\t\tif (simple && lastSimple) {\n\t\t\t\tchildren[children.length - 1] += child;\n\t\t\t} else if (children === EMPTY_CHILDREN) {\n\t\t\t\tchildren = [child];\n\t\t\t} else {\n\t\t\t\tchildren.push(child);\n\t\t\t}\n\n\t\t\tlastSimple = simple;\n\t\t}\n\t}\n\n\tvar p = new VNode();\n\tp.nodeName = nodeName;\n\tp.children = children;\n\tp.attributes = attributes == null ? undefined : attributes;\n\tp.key = attributes == null ? undefined : attributes.key;\n\n\tif (options.vnode !== undefined) options.vnode(p);\n\n\treturn p;\n}\n\nfunction extend(obj, props) {\n for (var i in props) {\n obj[i] = props[i];\n }return obj;\n}\n\nfunction applyRef(ref, value) {\n if (ref) {\n if (typeof ref == 'function') ref(value);else ref.current = value;\n }\n}\n\nvar defer = typeof Promise == 'function' ? Promise.resolve().then.bind(Promise.resolve()) : setTimeout;\n\nfunction cloneElement(vnode, props) {\n return h(vnode.nodeName, extend(extend({}, vnode.attributes), props), arguments.length > 2 ? [].slice.call(arguments, 2) : vnode.children);\n}\n\nvar IS_NON_DIMENSIONAL = /acit|ex(?:s|g|n|p|$)|rph|ows|mnc|ntw|ine[ch]|zoo|^ord/i;\n\nvar items = [];\n\nfunction enqueueRender(component) {\n\tif (!component._dirty && (component._dirty = true) && items.push(component) == 1) {\n\t\t(options.debounceRendering || defer)(rerender);\n\t}\n}\n\nfunction rerender() {\n\tvar p;\n\twhile (p = items.pop()) {\n\t\tif (p._dirty) renderComponent(p);\n\t}\n}\n\nfunction isSameNodeType(node, vnode, hydrating) {\n\tif (typeof vnode === 'string' || typeof vnode === 'number') {\n\t\treturn node.splitText !== undefined;\n\t}\n\tif (typeof vnode.nodeName === 'string') {\n\t\treturn !node._componentConstructor && isNamedNode(node, vnode.nodeName);\n\t}\n\treturn hydrating || node._componentConstructor === vnode.nodeName;\n}\n\nfunction isNamedNode(node, nodeName) {\n\treturn node.normalizedNodeName === nodeName || node.nodeName.toLowerCase() === nodeName.toLowerCase();\n}\n\nfunction getNodeProps(vnode) {\n\tvar props = extend({}, vnode.attributes);\n\tprops.children = vnode.children;\n\n\tvar defaultProps = vnode.nodeName.defaultProps;\n\tif (defaultProps !== undefined) {\n\t\tfor (var i in defaultProps) {\n\t\t\tif (props[i] === undefined) {\n\t\t\t\tprops[i] = defaultProps[i];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn props;\n}\n\nfunction createNode(nodeName, isSvg) {\n\tvar node = isSvg ? document.createElementNS('http://www.w3.org/2000/svg', nodeName) : document.createElement(nodeName);\n\tnode.normalizedNodeName = nodeName;\n\treturn node;\n}\n\nfunction removeNode(node) {\n\tvar parentNode = node.parentNode;\n\tif (parentNode) parentNode.removeChild(node);\n}\n\nfunction setAccessor(node, name, old, value, isSvg) {\n\tif (name === 'className') name = 'class';\n\n\tif (name === 'key') {} else if (name === 'ref') {\n\t\tapplyRef(old, null);\n\t\tapplyRef(value, node);\n\t} else if (name === 'class' && !isSvg) {\n\t\tnode.className = value || '';\n\t} else if (name === 'style') {\n\t\tif (!value || typeof value === 'string' || typeof old === 'string') {\n\t\t\tnode.style.cssText = value || '';\n\t\t}\n\t\tif (value && typeof value === 'object') {\n\t\t\tif (typeof old !== 'string') {\n\t\t\t\tfor (var i in old) {\n\t\t\t\t\tif (!(i in value)) node.style[i] = '';\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (var i in value) {\n\t\t\t\tnode.style[i] = typeof value[i] === 'number' && IS_NON_DIMENSIONAL.test(i) === false ? value[i] + 'px' : value[i];\n\t\t\t}\n\t\t}\n\t} else if (name === 'dangerouslySetInnerHTML') {\n\t\tif (value) node.innerHTML = value.__html || '';\n\t} else if (name[0] == 'o' && name[1] == 'n') {\n\t\tvar useCapture = name !== (name = name.replace(/Capture$/, ''));\n\t\tname = name.toLowerCase().substring(2);\n\t\tif (value) {\n\t\t\tif (!old) node.addEventListener(name, eventProxy, useCapture);\n\t\t} else {\n\t\t\tnode.removeEventListener(name, eventProxy, useCapture);\n\t\t}\n\t\t(node._listeners || (node._listeners = {}))[name] = value;\n\t} else if (name !== 'list' && name !== 'type' && !isSvg && name in node) {\n\t\ttry {\n\t\t\tnode[name] = value == null ? '' : value;\n\t\t} catch (e) {}\n\t\tif ((value == null || value === false) && name != 'spellcheck') node.removeAttribute(name);\n\t} else {\n\t\tvar ns = isSvg && name !== (name = name.replace(/^xlink:?/, ''));\n\n\t\tif (value == null || value === false) {\n\t\t\tif (ns) node.removeAttributeNS('http://www.w3.org/1999/xlink', name.toLowerCase());else node.removeAttribute(name);\n\t\t} else if (typeof value !== 'function') {\n\t\t\tif (ns) node.setAttributeNS('http://www.w3.org/1999/xlink', name.toLowerCase(), value);else node.setAttribute(name, value);\n\t\t}\n\t}\n}\n\nfunction eventProxy(e) {\n\treturn this._listeners[e.type](options.event && options.event(e) || e);\n}\n\nvar mounts = [];\n\nvar diffLevel = 0;\n\nvar isSvgMode = false;\n\nvar hydrating = false;\n\nfunction flushMounts() {\n\tvar c;\n\twhile (c = mounts.shift()) {\n\t\tif (options.afterMount) options.afterMount(c);\n\t\tif (c.componentDidMount) c.componentDidMount();\n\t}\n}\n\nfunction diff(dom, vnode, context, mountAll, parent, componentRoot) {\n\tif (!diffLevel++) {\n\t\tisSvgMode = parent != null && parent.ownerSVGElement !== undefined;\n\n\t\thydrating = dom != null && !('__preactattr_' in dom);\n\t}\n\n\tvar ret = idiff(dom, vnode, context, mountAll, componentRoot);\n\n\tif (parent && ret.parentNode !== parent) parent.appendChild(ret);\n\n\tif (! --diffLevel) {\n\t\thydrating = false;\n\n\t\tif (!componentRoot) flushMounts();\n\t}\n\n\treturn ret;\n}\n\nfunction idiff(dom, vnode, context, mountAll, componentRoot) {\n\tvar out = dom,\n\t prevSvgMode = isSvgMode;\n\n\tif (vnode == null || typeof vnode === 'boolean') vnode = '';\n\n\tif (typeof vnode === 'string' || typeof vnode === 'number') {\n\t\tif (dom && dom.splitText !== undefined && dom.parentNode && (!dom._component || componentRoot)) {\n\t\t\tif (dom.nodeValue != vnode) {\n\t\t\t\tdom.nodeValue = vnode;\n\t\t\t}\n\t\t} else {\n\t\t\tout = document.createTextNode(vnode);\n\t\t\tif (dom) {\n\t\t\t\tif (dom.parentNode) dom.parentNode.replaceChild(out, dom);\n\t\t\t\trecollectNodeTree(dom, true);\n\t\t\t}\n\t\t}\n\n\t\tout['__preactattr_'] = true;\n\n\t\treturn out;\n\t}\n\n\tvar vnodeName = vnode.nodeName;\n\tif (typeof vnodeName === 'function') {\n\t\treturn buildComponentFromVNode(dom, vnode, context, mountAll);\n\t}\n\n\tisSvgMode = vnodeName === 'svg' ? true : vnodeName === 'foreignObject' ? false : isSvgMode;\n\n\tvnodeName = String(vnodeName);\n\tif (!dom || !isNamedNode(dom, vnodeName)) {\n\t\tout = createNode(vnodeName, isSvgMode);\n\n\t\tif (dom) {\n\t\t\twhile (dom.firstChild) {\n\t\t\t\tout.appendChild(dom.firstChild);\n\t\t\t}\n\t\t\tif (dom.parentNode) dom.parentNode.replaceChild(out, dom);\n\n\t\t\trecollectNodeTree(dom, true);\n\t\t}\n\t}\n\n\tvar fc = out.firstChild,\n\t props = out['__preactattr_'],\n\t vchildren = vnode.children;\n\n\tif (props == null) {\n\t\tprops = out['__preactattr_'] = {};\n\t\tfor (var a = out.attributes, i = a.length; i--;) {\n\t\t\tprops[a[i].name] = a[i].value;\n\t\t}\n\t}\n\n\tif (!hydrating && vchildren && vchildren.length === 1 && typeof vchildren[0] === 'string' && fc != null && fc.splitText !== undefined && fc.nextSibling == null) {\n\t\tif (fc.nodeValue != vchildren[0]) {\n\t\t\tfc.nodeValue = vchildren[0];\n\t\t}\n\t} else if (vchildren && vchildren.length || fc != null) {\n\t\t\tinnerDiffNode(out, vchildren, context, mountAll, hydrating || props.dangerouslySetInnerHTML != null);\n\t\t}\n\n\tdiffAttributes(out, vnode.attributes, props);\n\n\tisSvgMode = prevSvgMode;\n\n\treturn out;\n}\n\nfunction innerDiffNode(dom, vchildren, context, mountAll, isHydrating) {\n\tvar originalChildren = dom.childNodes,\n\t children = [],\n\t keyed = {},\n\t keyedLen = 0,\n\t min = 0,\n\t len = originalChildren.length,\n\t childrenLen = 0,\n\t vlen = vchildren ? vchildren.length : 0,\n\t j,\n\t c,\n\t f,\n\t vchild,\n\t child;\n\n\tif (len !== 0) {\n\t\tfor (var i = 0; i < len; i++) {\n\t\t\tvar _child = originalChildren[i],\n\t\t\t props = _child['__preactattr_'],\n\t\t\t key = vlen && props ? _child._component ? _child._component.__key : props.key : null;\n\t\t\tif (key != null) {\n\t\t\t\tkeyedLen++;\n\t\t\t\tkeyed[key] = _child;\n\t\t\t} else if (props || (_child.splitText !== undefined ? isHydrating ? _child.nodeValue.trim() : true : isHydrating)) {\n\t\t\t\tchildren[childrenLen++] = _child;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (vlen !== 0) {\n\t\tfor (var i = 0; i < vlen; i++) {\n\t\t\tvchild = vchildren[i];\n\t\t\tchild = null;\n\n\t\t\tvar key = vchild.key;\n\t\t\tif (key != null) {\n\t\t\t\tif (keyedLen && keyed[key] !== undefined) {\n\t\t\t\t\tchild = keyed[key];\n\t\t\t\t\tkeyed[key] = undefined;\n\t\t\t\t\tkeyedLen--;\n\t\t\t\t}\n\t\t\t} else if (min < childrenLen) {\n\t\t\t\t\tfor (j = min; j < childrenLen; j++) {\n\t\t\t\t\t\tif (children[j] !== undefined && isSameNodeType(c = children[j], vchild, isHydrating)) {\n\t\t\t\t\t\t\tchild = c;\n\t\t\t\t\t\t\tchildren[j] = undefined;\n\t\t\t\t\t\t\tif (j === childrenLen - 1) childrenLen--;\n\t\t\t\t\t\t\tif (j === min) min++;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\tchild = idiff(child, vchild, context, mountAll);\n\n\t\t\tf = originalChildren[i];\n\t\t\tif (child && child !== dom && child !== f) {\n\t\t\t\tif (f == null) {\n\t\t\t\t\tdom.appendChild(child);\n\t\t\t\t} else if (child === f.nextSibling) {\n\t\t\t\t\tremoveNode(f);\n\t\t\t\t} else {\n\t\t\t\t\tdom.insertBefore(child, f);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (keyedLen) {\n\t\tfor (var i in keyed) {\n\t\t\tif (keyed[i] !== undefined) recollectNodeTree(keyed[i], false);\n\t\t}\n\t}\n\n\twhile (min <= childrenLen) {\n\t\tif ((child = children[childrenLen--]) !== undefined) recollectNodeTree(child, false);\n\t}\n}\n\nfunction recollectNodeTree(node, unmountOnly) {\n\tvar component = node._component;\n\tif (component) {\n\t\tunmountComponent(component);\n\t} else {\n\t\tif (node['__preactattr_'] != null) applyRef(node['__preactattr_'].ref, null);\n\n\t\tif (unmountOnly === false || node['__preactattr_'] == null) {\n\t\t\tremoveNode(node);\n\t\t}\n\n\t\tremoveChildren(node);\n\t}\n}\n\nfunction removeChildren(node) {\n\tnode = node.lastChild;\n\twhile (node) {\n\t\tvar next = node.previousSibling;\n\t\trecollectNodeTree(node, true);\n\t\tnode = next;\n\t}\n}\n\nfunction diffAttributes(dom, attrs, old) {\n\tvar name;\n\n\tfor (name in old) {\n\t\tif (!(attrs && attrs[name] != null) && old[name] != null) {\n\t\t\tsetAccessor(dom, name, old[name], old[name] = undefined, isSvgMode);\n\t\t}\n\t}\n\n\tfor (name in attrs) {\n\t\tif (name !== 'children' && name !== 'innerHTML' && (!(name in old) || attrs[name] !== (name === 'value' || name === 'checked' ? dom[name] : old[name]))) {\n\t\t\tsetAccessor(dom, name, old[name], old[name] = attrs[name], isSvgMode);\n\t\t}\n\t}\n}\n\nvar recyclerComponents = [];\n\nfunction createComponent(Ctor, props, context) {\n\tvar inst,\n\t i = recyclerComponents.length;\n\n\tif (Ctor.prototype && Ctor.prototype.render) {\n\t\tinst = new Ctor(props, context);\n\t\tComponent.call(inst, props, context);\n\t} else {\n\t\tinst = new Component(props, context);\n\t\tinst.constructor = Ctor;\n\t\tinst.render = doRender;\n\t}\n\n\twhile (i--) {\n\t\tif (recyclerComponents[i].constructor === Ctor) {\n\t\t\tinst.nextBase = recyclerComponents[i].nextBase;\n\t\t\trecyclerComponents.splice(i, 1);\n\t\t\treturn inst;\n\t\t}\n\t}\n\n\treturn inst;\n}\n\nfunction doRender(props, state, context) {\n\treturn this.constructor(props, context);\n}\n\nfunction setComponentProps(component, props, renderMode, context, mountAll) {\n\tif (component._disable) return;\n\tcomponent._disable = true;\n\n\tcomponent.__ref = props.ref;\n\tcomponent.__key = props.key;\n\tdelete props.ref;\n\tdelete props.key;\n\n\tif (typeof component.constructor.getDerivedStateFromProps === 'undefined') {\n\t\tif (!component.base || mountAll) {\n\t\t\tif (component.componentWillMount) component.componentWillMount();\n\t\t} else if (component.componentWillReceiveProps) {\n\t\t\tcomponent.componentWillReceiveProps(props, context);\n\t\t}\n\t}\n\n\tif (context && context !== component.context) {\n\t\tif (!component.prevContext) component.prevContext = component.context;\n\t\tcomponent.context = context;\n\t}\n\n\tif (!component.prevProps) component.prevProps = component.props;\n\tcomponent.props = props;\n\n\tcomponent._disable = false;\n\n\tif (renderMode !== 0) {\n\t\tif (renderMode === 1 || options.syncComponentUpdates !== false || !component.base) {\n\t\t\trenderComponent(component, 1, mountAll);\n\t\t} else {\n\t\t\tenqueueRender(component);\n\t\t}\n\t}\n\n\tapplyRef(component.__ref, component);\n}\n\nfunction renderComponent(component, renderMode, mountAll, isChild) {\n\tif (component._disable) return;\n\n\tvar props = component.props,\n\t state = component.state,\n\t context = component.context,\n\t previousProps = component.prevProps || props,\n\t previousState = component.prevState || state,\n\t previousContext = component.prevContext || context,\n\t isUpdate = component.base,\n\t nextBase = component.nextBase,\n\t initialBase = isUpdate || nextBase,\n\t initialChildComponent = component._component,\n\t skip = false,\n\t snapshot = previousContext,\n\t rendered,\n\t inst,\n\t cbase;\n\n\tif (component.constructor.getDerivedStateFromProps) {\n\t\tstate = extend(extend({}, state), component.constructor.getDerivedStateFromProps(props, state));\n\t\tcomponent.state = state;\n\t}\n\n\tif (isUpdate) {\n\t\tcomponent.props = previousProps;\n\t\tcomponent.state = previousState;\n\t\tcomponent.context = previousContext;\n\t\tif (renderMode !== 2 && component.shouldComponentUpdate && component.shouldComponentUpdate(props, state, context) === false) {\n\t\t\tskip = true;\n\t\t} else if (component.componentWillUpdate) {\n\t\t\tcomponent.componentWillUpdate(props, state, context);\n\t\t}\n\t\tcomponent.props = props;\n\t\tcomponent.state = state;\n\t\tcomponent.context = context;\n\t}\n\n\tcomponent.prevProps = component.prevState = component.prevContext = component.nextBase = null;\n\tcomponent._dirty = false;\n\n\tif (!skip) {\n\t\trendered = component.render(props, state, context);\n\n\t\tif (component.getChildContext) {\n\t\t\tcontext = extend(extend({}, context), component.getChildContext());\n\t\t}\n\n\t\tif (isUpdate && component.getSnapshotBeforeUpdate) {\n\t\t\tsnapshot = component.getSnapshotBeforeUpdate(previousProps, previousState);\n\t\t}\n\n\t\tvar childComponent = rendered && rendered.nodeName,\n\t\t toUnmount,\n\t\t base;\n\n\t\tif (typeof childComponent === 'function') {\n\n\t\t\tvar childProps = getNodeProps(rendered);\n\t\t\tinst = initialChildComponent;\n\n\t\t\tif (inst && inst.constructor === childComponent && childProps.key == inst.__key) {\n\t\t\t\tsetComponentProps(inst, childProps, 1, context, false);\n\t\t\t} else {\n\t\t\t\ttoUnmount = inst;\n\n\t\t\t\tcomponent._component = inst = createComponent(childComponent, childProps, context);\n\t\t\t\tinst.nextBase = inst.nextBase || nextBase;\n\t\t\t\tinst._parentComponent = component;\n\t\t\t\tsetComponentProps(inst, childProps, 0, context, false);\n\t\t\t\trenderComponent(inst, 1, mountAll, true);\n\t\t\t}\n\n\t\t\tbase = inst.base;\n\t\t} else {\n\t\t\tcbase = initialBase;\n\n\t\t\ttoUnmount = initialChildComponent;\n\t\t\tif (toUnmount) {\n\t\t\t\tcbase = component._component = null;\n\t\t\t}\n\n\t\t\tif (initialBase || renderMode === 1) {\n\t\t\t\tif (cbase) cbase._component = null;\n\t\t\t\tbase = diff(cbase, rendered, context, mountAll || !isUpdate, initialBase && initialBase.parentNode, true);\n\t\t\t}\n\t\t}\n\n\t\tif (initialBase && base !== initialBase && inst !== initialChildComponent) {\n\t\t\tvar baseParent = initialBase.parentNode;\n\t\t\tif (baseParent && base !== baseParent) {\n\t\t\t\tbaseParent.replaceChild(base, initialBase);\n\n\t\t\t\tif (!toUnmount) {\n\t\t\t\t\tinitialBase._component = null;\n\t\t\t\t\trecollectNodeTree(initialBase, false);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (toUnmount) {\n\t\t\tunmountComponent(toUnmount);\n\t\t}\n\n\t\tcomponent.base = base;\n\t\tif (base && !isChild) {\n\t\t\tvar componentRef = component,\n\t\t\t t = component;\n\t\t\twhile (t = t._parentComponent) {\n\t\t\t\t(componentRef = t).base = base;\n\t\t\t}\n\t\t\tbase._component = componentRef;\n\t\t\tbase._componentConstructor = componentRef.constructor;\n\t\t}\n\t}\n\n\tif (!isUpdate || mountAll) {\n\t\tmounts.push(component);\n\t} else if (!skip) {\n\n\t\tif (component.componentDidUpdate) {\n\t\t\tcomponent.componentDidUpdate(previousProps, previousState, snapshot);\n\t\t}\n\t\tif (options.afterUpdate) options.afterUpdate(component);\n\t}\n\n\twhile (component._renderCallbacks.length) {\n\t\tcomponent._renderCallbacks.pop().call(component);\n\t}if (!diffLevel && !isChild) flushMounts();\n}\n\nfunction buildComponentFromVNode(dom, vnode, context, mountAll) {\n\tvar c = dom && dom._component,\n\t originalComponent = c,\n\t oldDom = dom,\n\t isDirectOwner = c && dom._componentConstructor === vnode.nodeName,\n\t isOwner = isDirectOwner,\n\t props = getNodeProps(vnode);\n\twhile (c && !isOwner && (c = c._parentComponent)) {\n\t\tisOwner = c.constructor === vnode.nodeName;\n\t}\n\n\tif (c && isOwner && (!mountAll || c._component)) {\n\t\tsetComponentProps(c, props, 3, context, mountAll);\n\t\tdom = c.base;\n\t} else {\n\t\tif (originalComponent && !isDirectOwner) {\n\t\t\tunmountComponent(originalComponent);\n\t\t\tdom = oldDom = null;\n\t\t}\n\n\t\tc = createComponent(vnode.nodeName, props, context);\n\t\tif (dom && !c.nextBase) {\n\t\t\tc.nextBase = dom;\n\n\t\t\toldDom = null;\n\t\t}\n\t\tsetComponentProps(c, props, 1, context, mountAll);\n\t\tdom = c.base;\n\n\t\tif (oldDom && dom !== oldDom) {\n\t\t\toldDom._component = null;\n\t\t\trecollectNodeTree(oldDom, false);\n\t\t}\n\t}\n\n\treturn dom;\n}\n\nfunction unmountComponent(component) {\n\tif (options.beforeUnmount) options.beforeUnmount(component);\n\n\tvar base = component.base;\n\n\tcomponent._disable = true;\n\n\tif (component.componentWillUnmount) component.componentWillUnmount();\n\n\tcomponent.base = null;\n\n\tvar inner = component._component;\n\tif (inner) {\n\t\tunmountComponent(inner);\n\t} else if (base) {\n\t\tif (base['__preactattr_'] != null) applyRef(base['__preactattr_'].ref, null);\n\n\t\tcomponent.nextBase = base;\n\n\t\tremoveNode(base);\n\t\trecyclerComponents.push(component);\n\n\t\tremoveChildren(base);\n\t}\n\n\tapplyRef(component.__ref, null);\n}\n\nfunction Component(props, context) {\n\tthis._dirty = true;\n\n\tthis.context = context;\n\n\tthis.props = props;\n\n\tthis.state = this.state || {};\n\n\tthis._renderCallbacks = [];\n}\n\nextend(Component.prototype, {\n\tsetState: function setState(state, callback) {\n\t\tif (!this.prevState) this.prevState = this.state;\n\t\tthis.state = extend(extend({}, this.state), typeof state === 'function' ? state(this.state, this.props) : state);\n\t\tif (callback) this._renderCallbacks.push(callback);\n\t\tenqueueRender(this);\n\t},\n\tforceUpdate: function forceUpdate(callback) {\n\t\tif (callback) this._renderCallbacks.push(callback);\n\t\trenderComponent(this, 2);\n\t},\n\trender: function render() {}\n});\n\nfunction render(vnode, parent, merge) {\n return diff(merge, vnode, {}, false, parent, false);\n}\n\nfunction createRef() {\n\treturn {};\n}\n\nvar preact = {\n\th: h,\n\tcreateElement: h,\n\tcloneElement: cloneElement,\n\tcreateRef: createRef,\n\tComponent: Component,\n\trender: render,\n\trerender: rerender,\n\toptions: options\n};\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (preact);\n\n//# sourceMappingURL=preact.mjs.map\n\n\n//# sourceURL=webpack://Akko/./node_modules/preact/dist/preact.mjs?\n}");
/***/ }),
-/* 12 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-/**
- * @author Timur Kuzhagaliyev
- * @copyright 2017
- * @license GPL-3.0
- */
-
-var THREE = __webpack_require__(0);
-var elementResizeEvent = __webpack_require__(13);
-
-var Visualisers = __webpack_require__(3);
-
-var VisualisationCore = function () {
-
- /**
- * @param {object} data
- * @param {Element} data.parentElement
- * @param {boolean} data.useDefaultVisualisers
- * @param {object} data.analyser
- */
- function VisualisationCore(data) {
- _classCallCheck(this, VisualisationCore);
-
- this.parentElement = data.parentElement;
- this.frequencyDataArray = null;
- this.analyser = data.analyser;
+/***/ "./node_modules/whatwg-fetch/fetch.js":
+/*!********************************************!*\
+ !*** ./node_modules/whatwg-fetch/fetch.js ***!
+ \********************************************/
+/***/ (function() {
- /**
- * @callback visualiserListener
- * @param {Track[]} visualisers
- * @param {int} currentVisualiserIndex
- */
- /** @type {visualiserListener[]} */
- this.listeners = [];
-
- this.visualisers = data.useDefaultVisualisers ? this.prepareDefaultVisualisers() : [];
- this.currentVisualiserIndex = -1;
- }
-
- _createClass(VisualisationCore, [{
- key: 'prepareDefaultVisualisers',
- value: function prepareDefaultVisualisers() {
- var visualisers = [];
- for (var key in Visualisers) {
- if (!Visualisers.hasOwnProperty(key)) continue;
- var visualiserClass = Visualisers[key];
- visualisers.push(new visualiserClass());
- }
- return visualisers;
- }
- }, {
- key: 'notifyListeners',
- value: function notifyListeners() {
- for (var i = 0; i < this.listeners.length; i++) {
- var listener = this.listeners[i];
- listener(this.visualisers, this.currentVisualiserIndex);
- }
- }
-
- /**
- * @param {visualiserListener} listener
- */
-
- }, {
- key: 'addListener',
- value: function addListener(listener) {
- this.listeners.push(listener);
- this.notifyListeners();
- }
-
- /**
- * @param {Visualiser} visualiser
- */
-
- }, {
- key: 'addVisualiser',
- value: function addVisualiser(visualiser) {
- this.visualisers.push(visualiser);
- this.notifyListeners();
- }
- }, {
- key: 'prepare',
- value: function prepare() {
- var width = this.parentElement.offsetWidth;
- var height = this.parentElement.offsetHeight;
-
- this.renderer = new THREE.WebGLRenderer();
- this.renderer.setSize(width, height);
- this.canvas = this.renderer.domElement;
- this.parentElement.appendChild(this.canvas);
- }
- }, {
- key: 'start',
- value: function start() {
- this.setupListeners();
- this.renderLoop();
- this.notifyListeners();
- }
-
- /**
- * @param {int} index
- */
-
- }, {
- key: 'useVisualiser',
- value: function useVisualiser(index) {
- var visualiser = this.visualisers[index];
- if (visualiser) this.prepareVisualiser(visualiser);
- if (this.visualiser) this.visualiser.pause();
- this.currentVisualiserIndex = index;
- this.visualiser = visualiser;
- this.notifyListeners();
- }
-
- /**
- * @param {Visualiser} visualiser
- */
-
- }, {
- key: 'prepareVisualiser',
- value: function prepareVisualiser(visualiser) {
- this.analyser.fftSize = visualiser.fftSize;
- this.analyser.smoothingTimeConstant = visualiser.smoothingTimeConstant;
- this.frequencyDataArray = new Float32Array(this.analyser.frequencyBinCount);
- this.timeDomainDataArray = new Float32Array(this.analyser.frequencyBinCount);
- var data = {
- renderer: this.renderer,
- analyser: this.analyser,
- width: this.canvas.clientWidth,
- height: this.canvas.clientHeight
- };
- if (!visualiser.isInitialised()) visualiser.init(data);else if (visualiser.isPaused()) visualiser.revive(data);
- visualiser.resize(data);
- }
- }, {
- key: 'setupListeners',
- value: function setupListeners() {
- elementResizeEvent(this.parentElement, this.onParentResize.bind(this));
- }
- }, {
- key: 'renderLoop',
- value: function renderLoop() {
- var _this = this;
-
- if (this.visualiser) {
- if (this.analyser) {
- this.analyser.getFloatFrequencyData(this.frequencyDataArray);
- this.analyser.getFloatTimeDomainData(this.timeDomainDataArray);
- }
- this.visualiser.update({
- renderer: this.renderer,
- analyser: this.analyser,
- frequencyData: this.frequencyDataArray,
- timeDomainData: this.timeDomainDataArray
- });
- } else {
- // TODO: Display warning about no visualiser
- }
- setTimeout(function () {
- requestAnimationFrame(_this.renderLoop.bind(_this));
- }, 1000 / 30);
- }
- }, {
- key: 'onParentResize',
- value: function onParentResize() {
- var width = this.parentElement.offsetWidth;
- var height = this.parentElement.offsetHeight;
- this.renderer.setSize(width, height);
- if (this.visualiser) this.visualiser.resize({
- renderer: this.renderer,
- width: width,
- height: height
- });
- }
- }]);
-
- return VisualisationCore;
-}();
-
-module.exports = VisualisationCore;
+eval("{(function(self) {\n 'use strict';\n\n if (self.fetch) {\n return\n }\n\n var support = {\n searchParams: 'URLSearchParams' in self,\n iterable: 'Symbol' in self && 'iterator' in Symbol,\n blob: 'FileReader' in self && 'Blob' in self && (function() {\n try {\n new Blob()\n return true\n } catch(e) {\n return false\n }\n })(),\n formData: 'FormData' in self,\n arrayBuffer: 'ArrayBuffer' in self\n }\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ]\n\n var isDataView = function(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n }\n\n var isArrayBufferView = ArrayBuffer.isView || function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n } else if (Array.isArray(headers)) {\n headers.forEach(function(header) {\n this.append(header[0], header[1])\n }, this)\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue+','+value : value\n }\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n }\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n }\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n }\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n }\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n }\n\n Headers.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) { items.push(name) })\n return iteratorFor(items)\n }\n\n Headers.prototype.values = function() {\n var items = []\n this.forEach(function(value) { items.push(value) })\n return iteratorFor(items)\n }\n\n Headers.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) { items.push([name, value]) })\n return iteratorFor(items)\n }\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsText(blob)\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (!body) {\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n throw new Error('unsupported BodyInit type')\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {}\n var body = options.body\n\n if (input instanceof Request) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n } else {\n this.url = String(input)\n }\n\n this.credentials = options.credentials || this.credentials || 'omit'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n }\n\n Request.prototype.clone = function() {\n return new Request(this, { body: this._bodyInit })\n }\n\n function decode(body) {\n var form = new FormData()\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers()\n // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n // https://tools.ietf.org/html/rfc7230#section-3.2\n var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ')\n preProcessedHeaders.split(/\\r?\\n/).forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n headers.append(key, value)\n }\n })\n return headers\n }\n\n Body.call(Request.prototype)\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = options.status === undefined ? 200 : options.status\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = 'statusText' in options ? options.statusText : 'OK'\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n }\n\n Body.call(Response.prototype)\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n }\n\n Response.error = function() {\n var response = new Response(null, {status: 0, statusText: ''})\n response.type = 'error'\n return response\n }\n\n var redirectStatuses = [301, 302, 303, 307, 308]\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n }\n\n self.Headers = Headers\n self.Request = Request\n self.Response = Response\n\n self.fetch = function(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n var xhr = new XMLHttpRequest()\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n } else if (request.credentials === 'omit') {\n xhr.withCredentials = false\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n }\n self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n\n\n//# sourceURL=webpack://Akko/./node_modules/whatwg-fetch/fetch.js?\n}");
/***/ }),
-/* 13 */
-/***/ (function(module, exports) {
-
-var requestFrame = (function () {
- var window = this
- var raf = window.requestAnimationFrame ||
- window.mozRequestAnimationFrame ||
- window.webkitRequestAnimationFrame ||
- function fallbackRAF(func) {
- return window.setTimeout(func, 20)
- }
- return function requestFrameFunction(func) {
- return raf(func)
- }
-})()
-
-var cancelFrame = (function () {
- var window = this
- var cancel = window.cancelAnimationFrame ||
- window.mozCancelAnimationFrame ||
- window.webkitCancelAnimationFrame ||
- window.clearTimeout
- return function cancelFrameFunction(id) {
- return cancel(id)
- }
-})()
-function resizeListener(e) {
- var win = e.target || e.srcElement
- if (win.__resizeRAF__) {
- cancelFrame(win.__resizeRAF__)
- }
- win.__resizeRAF__ = requestFrame(function () {
- var trigger = win.__resizeTrigger__
- trigger.__resizeListeners__.forEach(function (fn) {
- fn.call(trigger, e)
- })
- })
-}
-
-var exports = function exports(element, fn) {
- var window = this
- var document = window.document
- var isIE
-
- var attachEvent = document.attachEvent
- if (typeof navigator !== 'undefined') {
- isIE = navigator.userAgent.match(/Trident/) ||
- navigator.userAgent.match(/Edge/)
- }
-
- function objectLoad() {
- this.contentDocument.defaultView.__resizeTrigger__ = this.__resizeElement__
- this.contentDocument.defaultView.addEventListener('resize', resizeListener)
- }
-
- if (!element.__resizeListeners__) {
- element.__resizeListeners__ = []
- if (attachEvent) {
- element.__resizeTrigger__ = element
- element.attachEvent('onresize', resizeListener)
- } else {
- if (getComputedStyle(element).position === 'static') {
- element.style.position = 'relative'
- }
- var obj = (element.__resizeTrigger__ = document.createElement('object'))
- obj.setAttribute(
- 'style',
- 'display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden; pointer-events: none; z-index: -1; opacity: 0;'
- )
- obj.setAttribute('class', 'resize-sensor')
- obj.__resizeElement__ = element
- obj.onload = objectLoad
- obj.type = 'text/html'
- if (isIE) {
- element.appendChild(obj)
- }
- obj.data = 'about:blank'
- if (!isIE) {
- element.appendChild(obj)
- }
- }
- }
- element.__resizeListeners__.push(fn)
-}
-
-module.exports = typeof window === 'undefined' ? exports : exports.bind(window)
-
-module.exports.unbind = function (element, fn) {
- var attachEvent = document.attachEvent
- if (fn) {
- element.__resizeListeners__.splice(
- element.__resizeListeners__.indexOf(fn),
- 1
- )
- } else {
- element.__resizeListeners__ = []
- }
- if (!element.__resizeListeners__.length) {
- if (attachEvent) {
- element.detachEvent('onresize', resizeListener)
- } else {
- element.__resizeTrigger__.contentDocument.defaultView.removeEventListener(
- 'resize',
- resizeListener
- )
- delete element.__resizeTrigger__.contentDocument.defaultView.__resizeTrigger__
- element.__resizeTrigger__ = !element.removeChild(
- element.__resizeTrigger__
- )
- }
- delete element.__resizeListeners__
- }
-}
-
-
-/***/ }),
-/* 14 */
-/***/ (function(module, exports, __webpack_require__) {
+/***/ "./sass/main.sass":
+/*!************************!*\
+ !*** ./sass/main.sass ***!
+ \************************/
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
-
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
-
-/**
- * @author Timur Kuzhagaliyev
- * @copyright 2017
- * @license GPL-3.0
- */
-
-var THREE = __webpack_require__(0);
-var Visualiser = __webpack_require__(1);
-
-var BAR_COUNT = 32;
-
-var BarVisualiser = function (_Visualiser) {
- _inherits(BarVisualiser, _Visualiser);
-
- function BarVisualiser() {
- _classCallCheck(this, BarVisualiser);
-
- return _possibleConstructorReturn(this, (BarVisualiser.__proto__ || Object.getPrototypeOf(BarVisualiser)).call(this, {
- code: 'Ba',
- name: 'Bars 3D',
- fftSize: BAR_COUNT * 2,
- smoothingTimeConstant: 0.9
- }));
- }
-
- _createClass(BarVisualiser, [{
- key: 'onInit',
- value: function onInit(data) {
- this.setupSceneAndCamera(data);
- this.setupLights(data);
- this.setupPlane(data);
- this.setupBars(data);
- }
- }, {
- key: 'setupSceneAndCamera',
- value: function setupSceneAndCamera(data) {
- this.scene = new THREE.Scene();
- this.camera = new THREE.PerspectiveCamera(60, data.width / data.height, 0.1, 100);
- this.camera.position.set(0, 15, 17);
- this.camera.rotation.x = -Math.PI / 4;
- this.cameraPivot = new THREE.Object3D();
- this.cameraPivot.add(this.camera);
- this.cameraPivot.castShadow = true;
- this.scene.add(this.cameraPivot);
- }
- }, {
- key: 'setupLights',
- value: function setupLights() {
- var ambientLight = new THREE.AmbientLight(0x404040, 0.8);
- this.scene.add(ambientLight);
- }
- }, {
- key: 'setupPlane',
- value: function setupPlane() {
- var planeGeometry = new THREE.PlaneGeometry(200, 200, 1);
- var planeMaterial = new THREE.MeshPhongMaterial({ color: 0x444444, side: THREE.DoubleSide });
- var plane = new THREE.Mesh(planeGeometry, planeMaterial);
- plane.receiveShadow = true;
- plane.rotation.x = Math.PI / 2;
- this.scene.add(plane);
- }
- }, {
- key: 'setupBars',
- value: function setupBars() {
- this.bars = [];
- this.lights = [];
- this.cubeLights = [];
- var step = 2 * Math.PI / BAR_COUNT;
- var geometry = new THREE.BoxGeometry(0.5, 10, 0.5);
- var radius = 5;
- for (var i = 0; i < BAR_COUNT; i++) {
- var color = 0xff0000 + i * 5;
- var bar = new THREE.Object3D();
- var material = new THREE.MeshLambertMaterial({ color: color });
- var cube = new THREE.Mesh(geometry, material);
- var cubeLight = new THREE.PointLight(color, 0, 4);
- cubeLight.position.y = 7;
- cubeLight.position.x = -1;
- cube.add(cubeLight);
- var light = new THREE.PointLight(color, 0, 10);
- light.position.y = 1;
- light.position.x = 10;
- bar.add(light);
- bar.add(cube);
- bar.position.x = radius;
- cube.position.y = -4.8;
- var pivot = new THREE.Object3D();
- pivot.rotation.y = step * i;
- pivot.add(bar);
- this.scene.add(pivot);
- this.bars.push(cube);
- this.lights.push(light);
- this.cubeLights.push(cubeLight);
- }
- }
- }, {
- key: 'onUpdate',
- value: function onUpdate(data) {
- for (var i = 0; i < BAR_COUNT; i++) {
- var bar = this.bars[i];
- var light = this.lights[i];
- var cubeLight = this.cubeLights[i];
- var frequency = Math.abs(data.frequencyData[i]);
- var timeDomain = data.timeDomainData[i];
-
- var value = frequency * timeDomain;
- if (value === Infinity || value === -Infinity) continue;
- var newY = bar.position.y + (value - bar.position.y) / 30;
- if (isNaN(newY)) continue;
-
- light.intensity = Math.max(0, newY);
- cubeLight.intensity = Math.max(0, newY) * 0.5;
- bar.position.y = newY;
- }
- this.cameraPivot.rotation.y += 0.01;
- data.renderer.render(this.scene, this.camera);
- }
- }, {
- key: 'onResize',
- value: function onResize(data) {
- this.camera.aspect = data.width / data.height;
- this.camera.updateProjectionMatrix();
- }
- }, {
- key: 'onDestroy',
- value: function onDestroy() {
- delete this.scene;
- delete this.camera;
- }
- }]);
-
- return BarVisualiser;
-}(Visualiser);
-
-module.exports = BarVisualiser;
+eval("{__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n//# sourceURL=webpack://Akko/./sass/main.sass?\n}");
/***/ }),
-/* 15 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-/**
- * @author Timur Kuzhagaliyev
- * @copyright 2017
- * @license GPL-3.0
- */
-
-var Helper = function () {
- function Helper() {
- _classCallCheck(this, Helper);
- }
-
- _createClass(Helper, [{
- key: "lerp",
- value: function lerp(current, target, fraction) {
- if (isNaN(target) || target === Infinity || target === -Infinity) return current;
- return current + (target - current) * fraction;
- }
- }, {
- key: "constrain",
- value: function constrain(max, min, value) {
- return Math.min(max, Math.max(min, value));
- }
- }]);
-
- return Helper;
-}();
-
-module.exports = Helper;
-
-/***/ }),
-/* 16 */
-/***/ (function(module, exports, __webpack_require__) {
+/***/ "bluebird":
+/*!**************************!*\
+ !*** external "Promise" ***!
+ \**************************/
+/***/ ((module) => {
"use strict";
-
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
-
-/**
- * @author Timur Kuzhagaliyev
- * @copyright 2017
- * @license GPL-3.0
- */
-
-var THREE = __webpack_require__(0);
-var Visualiser = __webpack_require__(1);
-
-var RING_COUNT = 16;
-
-var RingVisualiser = function (_Visualiser) {
- _inherits(RingVisualiser, _Visualiser);
-
- function RingVisualiser() {
- _classCallCheck(this, RingVisualiser);
-
- return _possibleConstructorReturn(this, (RingVisualiser.__proto__ || Object.getPrototypeOf(RingVisualiser)).call(this, {
- code: 'Rn',
- name: 'Rings 2D',
- fftSize: RING_COUNT * 2,
- smoothingTimeConstant: 0.9
- }));
- }
-
- _createClass(RingVisualiser, [{
- key: 'onInit',
- value: function onInit(data) {
- this.setupSceneAndCamera(data);
- this.setupRings();
- }
- }, {
- key: 'setupSceneAndCamera',
- value: function setupSceneAndCamera(data) {
- this.scene = new THREE.Scene();
-
- this.camera = new THREE.PerspectiveCamera(60, data.width / data.height, 0.1, 100);
- this.camera.position.z = 20;
- this.camera.lookAt(new THREE.Vector3(0, 0, 0));
- this.scene.add(this.camera);
- }
- }, {
- key: 'setupRings',
- value: function setupRings() {
- this.rings = [];
- var hslStep = 1 / RING_COUNT;
- for (var i = 0; i < RING_COUNT; i++) {
- var radius = 2 + i;
- var segments = 64;
- var material = new THREE.LineBasicMaterial({ color: 0x0000ff * i });
- material.color.setHSL(hslStep * i, 1, 0.5);
- var geometry = new THREE.CircleGeometry(radius, segments);
- var ring = new THREE.Line(geometry, material);
- this.scene.add(ring);
- this.rings.push(ring);
- }
- }
- }, {
- key: 'onUpdate',
- value: function onUpdate(data) {
- for (var i = 0; i < RING_COUNT; i++) {
- var ring = this.rings[i];
- var timeDomain = data.timeDomainData[i];
- var frequency = Math.abs(data.frequencyData[i]);
- var scale = this.lerp(ring.scale.x, frequency * timeDomain, 0.01);
- scale = this.constrain(2, 0.5, scale);
- ring.scale.set(scale, scale, scale);
- ring.rotation.z += 0.002 * i;
- }
- data.renderer.render(this.scene, this.camera);
- }
- }, {
- key: 'onResize',
- value: function onResize(data) {
- this.camera.aspect = data.width / data.height;
- this.camera.updateProjectionMatrix();
- }
- }, {
- key: 'onDestroy',
- value: function onDestroy() {
- delete this.scene;
- delete this.camera;
- }
- }]);
-
- return RingVisualiser;
-}(Visualiser);
-
-module.exports = RingVisualiser;
+module.exports = Promise;
/***/ }),
-/* 17 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-/**
- * @author Timur Kuzhagaliyev
- * @copyright 2017
- * @license GPL-3.0
- */
-
-// eslint-disable-next-line
-var _require = __webpack_require__(4),
- render = _require.render,
- h = _require.h;
-// eslint-disable-next-line
-
-var UIComponent = __webpack_require__(18);
-
-var UI = function () {
-
- /**
- * @param {object} data
- * @param {Element} data.container
- * @param {MusicPlayer} data.musicPlayer
- * @param {VisualisationCore} data.visCore
- */
- function UI(data) {
- _classCallCheck(this, UI);
-
- this.container = data.container;
- this.musicPlayer = data.musicPlayer;
- this.visCore = data.visCore;
- }
-
- _createClass(UI, [{
- key: 'start',
- value: function start() {
- render(h(UIComponent, { musicPlayer: this.musicPlayer, visCore: this.visCore }), this.container);
- }
- }]);
-
- return UI;
-}();
-
-module.exports = UI;
-
-/***/ }),
-/* 18 */
-/***/ (function(module, exports, __webpack_require__) {
+/***/ "three":
+/*!************************!*\
+ !*** external "THREE" ***!
+ \************************/
+/***/ ((module) => {
"use strict";
-
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
-
-/**
- * @author Timur Kuzhagaliyev
- * @copyright 2017
- * @license GPL-3.0
- */
-
-// eslint-disable-next-line
-var _require = __webpack_require__(4),
- Component = _require.Component,
- h = _require.h;
-
-var PlayerStates = __webpack_require__(2).States;
-
-var UIComponent = function (_Component) {
- _inherits(UIComponent, _Component);
-
- function UIComponent(props) {
- _classCallCheck(this, UIComponent);
-
- var _this = _possibleConstructorReturn(this, (UIComponent.__proto__ || Object.getPrototypeOf(UIComponent)).call(this, props));
-
- _this.state = {
- playerState: null,
- trackList: [],
- currentTrackIndex: null,
- visualisers: [],
- currentVisualiserIndex: null
- };
- props.musicPlayer.addListener(_this.playbackListener.bind(_this));
- props.visCore.addListener(_this.visualiserListener.bind(_this));
- return _this;
- }
-
- _createClass(UIComponent, [{
- key: 'playbackListener',
- value: function playbackListener(playerState, trackList, currentTrackIndex) {
- this.setState({
- playerState: playerState,
- trackList: trackList,
- currentTrackIndex: currentTrackIndex
- });
- }
- }, {
- key: 'visualiserListener',
- value: function visualiserListener(visualisers, currentVisualiserIndex) {
- this.setState({
- visualisers: visualisers,
- currentVisualiserIndex: currentVisualiserIndex
- });
- }
- }, {
- key: 'playTrack',
- value: function playTrack(index, event) {
- event.preventDefault();
- this.props.musicPlayer.playTrack(index);
- }
- }, {
- key: 'togglePlayback',
- value: function togglePlayback(event) {
- event.preventDefault();
- var state = this.state;
- state.playing = this.props.musicPlayer.togglePlayback();
- this.setState(state);
- }
- }, {
- key: 'addTrackByUrl',
- value: function addTrackByUrl(event) {
- event.preventDefault();
- var audioUrl = prompt('Enter the URL of an audio file');
- if (audioUrl) {
- this.props.musicPlayer.addTrack(audioUrl);
- }
- }
- }, {
- key: 'uploadAudioFile',
- value: function uploadAudioFile(event) {
- event.preventDefault();
- if (!this.fileInput) return;
- if (!this.fileInput.onchange) this.fileInput.onchange = this.addAudioFile.bind(this);
- this.fileInput.click();
- }
- }, {
- key: 'addAudioFile',
- value: function addAudioFile() {
- var files = this.fileInput.files;
- for (var i = 0; i < files.length; i++) {
- var file = files[i];
- if (file.type.match(/audio.*/)) {
- this.props.musicPlayer.addTrack(file);
- }
- }
- }
- }, {
- key: 'getTrackList',
- value: function getTrackList() {
- var trackList = this.state.trackList;
- if (trackList) {
- var trackComponents = [];
- for (var i = 0; i < trackList.length; i++) {
- var track = trackList[i];
- var isActive = this.state.currentTrackIndex === i;
- var activeClass = isActive ? 'active' : '';
- var symbol = isActive ? this.getPlaybackSymbol() : '#' + (i + 1);
- trackComponents.push(h(
- 'a',
- { href: '#', alt: 'Play track #' + (i + 1), onClick: this.playTrack.bind(this, i),
- className: 'akko-ui-container-list-item ' + activeClass },
- h(
- 'span',
- null,
- symbol
- ),
- ' ',
- track.title
- ));
- }
- return h(
- 'div',
- { className: 'akko-ui-container-list' },
- trackComponents
- );
- } else {
- return null;
- }
- }
- }, {
- key: 'getPlaybackSymbol',
- value: function getPlaybackSymbol() {
- return !this.isPlaying() ? '❚❚' : '►';
- }
- }, {
- key: 'getPlaybackButtonSymbol',
- value: function getPlaybackButtonSymbol() {
- return this.isPlaying() ? '❚❚' : '►';
- }
- }, {
- key: 'isPlaying',
- value: function isPlaying() {
- return this.state.playerState === PlayerStates.PLAYING;
- }
- }, {
- key: 'useVisualiser',
- value: function useVisualiser(index, event) {
- event.preventDefault();
- this.props.visCore.useVisualiser(index);
- }
- }, {
- key: 'getVisualiserList',
- value: function getVisualiserList() {
- var visualisers = this.state.visualisers;
- if (visualisers) {
- var visualiserComponents = [];
- for (var i = 0; i < visualisers.length; i++) {
- var visualiser = visualisers[i];
- var isActive = this.state.currentVisualiserIndex === i;
- var activeClass = isActive ? 'active' : '';
- var symbol = visualiser.code;
- visualiserComponents.push(h(
- 'a',
- { href: '#', alt: 'Use visualiser #' + (i + 1),
- onClick: this.useVisualiser.bind(this, i),
- className: 'akko-ui-container-list-item ' + activeClass },
- h(
- 'span',
- null,
- symbol
- ),
- ' ',
- visualiser.name
- ));
- }
- return h(
- 'div',
- { className: 'akko-ui-container-list' },
- visualiserComponents
- );
- } else {
- return null;
- }
- }
- }, {
- key: 'render',
- value: function render() {
- var _this2 = this;
-
- return h(
- 'div',
- { className: 'akko-ui' },
- h(
- 'div',
- { className: 'akko-ui-container akko-ui-tracks' },
- h(
- 'div',
- { className: 'akko-ui-container-title' },
- 'Player: ',
- this.state.playerState
- ),
- this.getTrackList(),
- h(
- 'div',
- { className: 'akko-ui-add-tracks' },
- h('input', { ref: function ref(input) {
- return _this2.fileInput = input;
- }, type: 'file', style: 'display: none;' }),
- h(
- 'a',
- { href: '#', alt: 'Add a track by URL', onClick: this.addTrackByUrl.bind(this) },
- 'Add track by URL'
- ),
- ' or ',
- h(
- 'a',
- { href: '#', alt: 'Upload an audio file', onClick: this.uploadAudioFile.bind(this) },
- 'upload audio file'
- ),
- h('br', null),
- 'or drag & drop a file into the visualiser.'
- )
- ),
- h(
- 'div',
- { className: 'akko-ui-container akko-ui-visualisers' },
- h(
- 'div',
- { className: 'akko-ui-container-title' },
- 'Visualisers'
- ),
- this.getVisualiserList()
- ),
- h(
- 'div',
- { className: 'akko-ui-controls' },
- h(
- 'a',
- { href: '#', alt: 'Toggle playback', onClick: this.togglePlayback.bind(this),
- className: 'akko-ui-controls-play ' + (this.isPlaying() ? 'active' : '') },
- this.getPlaybackButtonSymbol()
- ),
- h(
- 'div',
- { className: 'akko-ui-controls-progress' },
- h('div', { className: 'akko-ui-controls-progress-indicator' })
- ),
- h('div', { className: 'akko-ui-controls-volume' })
- )
- );
- }
- }]);
-
- return UIComponent;
-}(Component);
-
-module.exports = UIComponent;
+module.exports = THREE;
/***/ })
-/******/ ]);
\ No newline at end of file
+
+/******/ });
+/************************************************************************/
+/******/ // The module cache
+/******/ var __webpack_module_cache__ = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/ // Check if module is in cache
+/******/ var cachedModule = __webpack_module_cache__[moduleId];
+/******/ if (cachedModule !== undefined) {
+/******/ return cachedModule.exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = __webpack_module_cache__[moduleId] = {
+/******/ // no module.id needed
+/******/ // no module.loaded needed
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/************************************************************************/
+/******/ /* webpack/runtime/define property getters */
+/******/ (() => {
+/******/ // define getter functions for harmony exports
+/******/ __webpack_require__.d = (exports, definition) => {
+/******/ for(var key in definition) {
+/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
+/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
+/******/ }
+/******/ }
+/******/ };
+/******/ })();
+/******/
+/******/ /* webpack/runtime/hasOwnProperty shorthand */
+/******/ (() => {
+/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
+/******/ })();
+/******/
+/******/ /* webpack/runtime/make namespace object */
+/******/ (() => {
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = (exports) => {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/ })();
+/******/
+/************************************************************************/
+/******/
+/******/ // startup
+/******/ // Load entry module and return exports
+/******/ // This entry module can't be inlined because the eval devtool is used.
+/******/ __webpack_require__("./sass/main.sass");
+/******/ __webpack_require__("./node_modules/whatwg-fetch/fetch.js");
+/******/ var __webpack_exports__ = __webpack_require__("./index.js");
+/******/ Akko = __webpack_exports__;
+/******/
+/******/ })()
+;
\ No newline at end of file
diff --git a/dist/akko.js.backup b/dist/akko.js.backup
new file mode 100644
index 0000000..6a9ccbe
--- /dev/null
+++ b/dist/akko.js.backup
@@ -0,0 +1,3206 @@
+/*! Akko v0.1.0 | (c) Timur Kuzhagaliyev | github.com/TimboKZ/Akko */
+var Akko =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 5);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports) {
+
+module.exports = THREE;
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * @author Timur Kuzhagaliyev
+ * @copyright 2017
+ * @license GPL-3.0
+ */
+
+var Helper = __webpack_require__(15);
+
+/**
+ * @abstract
+ */
+
+var Visualiser = function (_Helper) {
+ _inherits(Visualiser, _Helper);
+
+ /**
+ * @param {object} data
+ * @param {string} data.code
+ * @param {string} data.name
+ * @param {int} data.fftSize
+ * @param {number} data.smoothingTimeConstant
+ */
+ function Visualiser(data) {
+ _classCallCheck(this, Visualiser);
+
+ var _this = _possibleConstructorReturn(this, (Visualiser.__proto__ || Object.getPrototypeOf(Visualiser)).call(this));
+
+ _this.code = data.code || 'UV';
+ _this.name = data.name || 'Untitled Visualiser';
+ _this.fftSize = data.fftSize || 128;
+ _this.smoothingTimeConstant = data.smoothingTimeConstant || 0;
+ _this.initialised = false;
+ _this.paused = false;
+ return _this;
+ }
+
+ /**
+ * @param {object} data
+ * @param {THREE.WebGLRenderer} data.renderer
+ * @param {AnalyserNode} data.analyser
+ * @param {number} data.height
+ * @param {number} data.width
+ */
+
+
+ _createClass(Visualiser, [{
+ key: 'init',
+ value: function init(data) {
+ this.onInit(data);
+ this.initialised = true;
+ }
+
+ /**
+ * @abstract
+ * @param {object} data
+ * @param {THREE.WebGLRenderer} data.renderer
+ * @param {AnalyserNode} data.analyser
+ * @param {number} data.height
+ * @param {number} data.width
+ */
+ // eslint-disable-next-line
+
+ }, {
+ key: 'onInit',
+ value: function onInit(data) {
+ throw new Error('The \'onInit\' method was not defined on ' + this.name + '!');
+ }
+
+ /**
+ * @param {object} data
+ * @param {THREE.WebGLRenderer} data.renderer
+ * @param {AnalyserNode} data.analyser
+ * @param {number} data.height
+ * @param {number} data.width
+ */
+
+ }, {
+ key: 'revive',
+ value: function revive(data) {
+ this.onRevive(data);
+ this.paused = false;
+ }
+
+ /**
+ * @abstract
+ * @param {object} data
+ * @param {THREE.WebGLRenderer} data.renderer
+ * @param {AnalyserNode} data.analyser
+ * @param {number} data.height
+ * @param {number} data.width
+ */
+ // eslint-disable-next-line
+
+ }, {
+ key: 'onRevive',
+ value: function onRevive(data) {}
+
+ /**
+ * @param {object} data
+ * @param {THREE.WebGLRenderer} data.renderer
+ * @param {AnalyserNode} data.analyser
+ * @param {Float32Array} data.frequencyData
+ * @param {Float32Array} data.timeDomainData
+ */
+
+ }, {
+ key: 'update',
+ value: function update(data) {
+ this.onUpdate(data);
+ }
+
+ /**
+ * @abstract
+ * @param {object} data
+ * @param {THREE.WebGLRenderer} data.renderer
+ * @param {AnalyserNode} data.analyser
+ * @param {Float32Array} data.frequencyData
+ * @param {Float32Array} data.timeDomainData
+ */
+ // eslint-disable-next-line
+
+ }, {
+ key: 'onUpdate',
+ value: function onUpdate(data) {
+ throw new Error('The \'onUpdate\' method was not defined on ' + this.name + '!');
+ }
+
+ /**
+ * @param {THREE.WebGLRenderer} data.renderer
+ * @param {AnalyserNode} data.analyser
+ * @param {number} data.height
+ * @param {number} data.width
+ */
+
+ }, {
+ key: 'resize',
+ value: function resize(data) {
+ this.onResize(data);
+ }
+
+ /**
+ * @abstract
+ * @param {THREE.WebGLRenderer} data.renderer
+ * @param {AnalyserNode} data.analyser
+ * @param {number} data.height
+ * @param {number} data.width
+ */
+ // eslint-disable-next-line
+
+ }, {
+ key: 'onResize',
+ value: function onResize(data) {}
+ }, {
+ key: 'pause',
+ value: function pause() {
+ this.onPause();
+ this.paused = true;
+ }
+
+ /**
+ * @abstract
+ */
+
+ }, {
+ key: 'onPause',
+ value: function onPause() {}
+ }, {
+ key: 'destroy',
+ value: function destroy() {
+ this.onDestroy();
+ }
+
+ /**
+ * @abstract
+ */
+
+ }, {
+ key: 'onDestroy',
+ value: function onDestroy() {
+ throw new Error('The \'onDestroy\' method was not defined on ' + this.name + '!');
+ }
+ }, {
+ key: 'error',
+ value: function error(message) {
+ // TODO: Draw error message on canvas
+ throw new Error(message);
+ }
+ }, {
+ key: 'isInitialised',
+ value: function isInitialised() {
+ return this.initialised;
+ }
+ }, {
+ key: 'isPaused',
+ value: function isPaused() {
+ return this.paused;
+ }
+ }]);
+
+ return Visualiser;
+}(Helper);
+
+module.exports = Visualiser;
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+/**
+ * @author Timur Kuzhagaliyev
+ * @copyright 2017
+ * @license GPL-3.0
+ */
+
+var Promise = __webpack_require__(10);
+var Track = __webpack_require__(11);
+
+var PlayerStates = {
+ LOADING: 'Loading...',
+ READY: 'Ready!',
+ PLAYING: 'Playing...',
+ PAUSED: 'Paused.',
+ FINISHED: 'Finished!'
+};
+
+var MusicPlayer = function () {
+
+ /**
+ * @param data
+ * @param {AudioContext} data.audioContext
+ * @param {boolean} data.autoPlay
+ */
+ function MusicPlayer(data) {
+ _classCallCheck(this, MusicPlayer);
+
+ this.context = data.audioContext;
+ this.autoPlay = data.autoPlay;
+ this.gain = this.context.createGain();
+ this.gain.connect(this.context.destination);
+ this.analyser = this.context.createAnalyser();
+ this.analyser.connect(this.context.destination);
+
+ this.buffer = null;
+ this.sourceNode = this.context.createBufferSource();
+ this.startedAt = 0;
+ this.pausedAt = 0;
+ this.playing = false;
+
+ /**
+ * @callback playbackListener
+ * @param {string} playerState
+ * @param {Track[]} trackList
+ * @param {int} currentTrackIndex
+ */
+ /** @type {playbackListener[]} */
+ this.listeners = [];
+
+ /** @type {Track[]} */
+ this.trackList = [];
+ this.currentTrackIndex = -1;
+
+ this.setState(PlayerStates.READY);
+ }
+
+ _createClass(MusicPlayer, [{
+ key: 'setState',
+ value: function setState(newState) {
+ this.state = newState;
+ this.notifyListeners();
+ }
+ }, {
+ key: 'notifyListeners',
+ value: function notifyListeners() {
+ for (var i = 0; i < this.listeners.length; i++) {
+ var listener = this.listeners[i];
+ listener(this.state, this.trackList, this.currentTrackIndex);
+ }
+ }
+
+ /**
+ * @param {playbackListener} listener
+ */
+
+ }, {
+ key: 'addListener',
+ value: function addListener(listener) {
+ this.listeners.push(listener);
+ }
+ }, {
+ key: 'start',
+ value: function start() {
+ this.setState(PlayerStates.READY);
+ if (this.autoPlay) this.playNextTrack();
+ this.started = true;
+ }
+
+ /**
+ * @param {int} [currentTrackIndex] Current track index override
+ */
+
+ }, {
+ key: 'playNextTrack',
+ value: function playNextTrack(currentTrackIndex) {
+ var currentIndex = currentTrackIndex || this.currentTrackIndex;
+ var nextTrackIndex = currentIndex + 1;
+ if (nextTrackIndex >= this.trackList.length) {
+ return this.setState(PlayerStates.FINISHED);
+ }
+ this.playTrack(nextTrackIndex);
+ }
+ }, {
+ key: 'playTrack',
+ value: function playTrack(index) {
+ var _this = this;
+
+ this.setState(PlayerStates.LOADING);
+ var track = this.trackList[index];
+ Promise.resolve().then(function () {
+ return track.prepareArrayBuffer();
+ }).then(function (arrayBuffer) {
+ return _this.context.decodeAudioData(arrayBuffer);
+ }).then(function (audioBuffer) {
+ _this.buffer = audioBuffer;
+ _this.stop();
+ _this.play();
+ _this.currentTrackIndex = index;
+ _this.setState(PlayerStates.PLAYING);
+ }).catch(function (error) {
+ console.error('Error preparing track:', error);
+ console.warn('Skipping \'' + track.title + '\'!');
+ return _this.playNextTrack(index);
+ });
+ }
+ }, {
+ key: 'togglePlayback',
+ value: function togglePlayback() {
+ if (this.playing) {
+ this.pause();
+ } else {
+ if (this.buffer === null) this.playNextTrack();else this.play();
+ }
+ return this.playing;
+ }
+ }, {
+ key: 'play',
+ value: function play() {
+ var offset = this.pausedAt;
+ this.sourceNode = this.context.createBufferSource();
+ this.sourceNode.connect(this.gain);
+ this.sourceNode.connect(this.analyser);
+ this.sourceNode.buffer = this.buffer;
+ this.sourceNode.onended = this.ended.bind(this);
+ this.sourceNode.start(0, offset);
+ this.startedAt = this.context.currentTime - offset;
+ this.pausedAt = 0;
+ this.playing = true;
+ this.setState(PlayerStates.PLAYING);
+ }
+ }, {
+ key: 'pause',
+ value: function pause() {
+ if (!this.playing) return;
+ var elapsed = this.context.currentTime - this.startedAt;
+ this.stop();
+ this.pausedAt = elapsed;
+ this.setState(PlayerStates.PAUSED);
+ }
+ }, {
+ key: 'stop',
+ value: function stop() {
+ if (!this.playing) return;
+ if (this.sourceNode) {
+ this.sourceNode.disconnect();
+ this.sourceNode.stop(0);
+ this.sourceNode = null;
+ }
+ this.pausedAt = 0;
+ this.startedAt = 0;
+ this.playing = false;
+ }
+ }, {
+ key: 'ended',
+ value: function ended() {
+ this.playNextTrack();
+ }
+ }, {
+ key: 'addTrack',
+ value: function addTrack(source, title) {
+ var track = new Track({
+ source: source,
+ title: title
+ });
+ var length = this.trackList.push(track);
+ this.notifyListeners();
+ if (this.started) this.playTrack(length - 1);
+ }
+ }, {
+ key: 'getAnalyser',
+ value: function getAnalyser() {
+ return this.analyser;
+ }
+ }]);
+
+ return MusicPlayer;
+}();
+
+module.exports = MusicPlayer;
+module.exports.States = PlayerStates;
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+/**
+ * @author Timur Kuzhagaliyev
+ * @copyright 2017
+ * @license GPL-3.0
+ */
+
+module.exports = {
+ BarVisualiser: __webpack_require__(14),
+ RingVisualiser: __webpack_require__(16)
+};
+
+/***/ }),
+/* 4 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return h; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createElement", function() { return h; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cloneElement", function() { return cloneElement; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Component", function() { return Component; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "render", function() { return render; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rerender", function() { return rerender; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "options", function() { return options; });
+/** Virtual DOM Node */
+function VNode() {}
+
+/** Global options
+ * @public
+ * @namespace options {Object}
+ */
+var options = {
+
+ /** If `true`, `prop` changes trigger synchronous component updates.
+ * @name syncComponentUpdates
+ * @type Boolean
+ * @default true
+ */
+ //syncComponentUpdates: true,
+
+ /** Processes all created VNodes.
+ * @param {VNode} vnode A newly-created VNode to normalize/process
+ */
+ //vnode(vnode) { }
+
+ /** Hook invoked after a component is mounted. */
+ // afterMount(component) { }
+
+ /** Hook invoked after the DOM is updated with a component's latest render. */
+ // afterUpdate(component) { }
+
+ /** Hook invoked immediately before a component is unmounted. */
+ // beforeUnmount(component) { }
+};
+
+var stack = [];
+
+var EMPTY_CHILDREN = [];
+
+/** JSX/hyperscript reviver
+* Benchmarks: https://esbench.com/bench/57ee8f8e330ab09900a1a1a0
+ * @see http://jasonformat.com/wtf-is-jsx
+ * @public
+ */
+function h(nodeName, attributes) {
+ var children = EMPTY_CHILDREN,
+ lastSimple,
+ child,
+ simple,
+ i;
+ for (i = arguments.length; i-- > 2;) {
+ stack.push(arguments[i]);
+ }
+ if (attributes && attributes.children != null) {
+ if (!stack.length) stack.push(attributes.children);
+ delete attributes.children;
+ }
+ while (stack.length) {
+ if ((child = stack.pop()) && child.pop !== undefined) {
+ for (i = child.length; i--;) {
+ stack.push(child[i]);
+ }
+ } else {
+ if (typeof child === 'boolean') child = null;
+
+ if (simple = typeof nodeName !== 'function') {
+ if (child == null) child = '';else if (typeof child === 'number') child = String(child);else if (typeof child !== 'string') simple = false;
+ }
+
+ if (simple && lastSimple) {
+ children[children.length - 1] += child;
+ } else if (children === EMPTY_CHILDREN) {
+ children = [child];
+ } else {
+ children.push(child);
+ }
+
+ lastSimple = simple;
+ }
+ }
+
+ var p = new VNode();
+ p.nodeName = nodeName;
+ p.children = children;
+ p.attributes = attributes == null ? undefined : attributes;
+ p.key = attributes == null ? undefined : attributes.key;
+
+ // if a "vnode hook" is defined, pass every created VNode to it
+ if (options.vnode !== undefined) options.vnode(p);
+
+ return p;
+}
+
+/** Copy own-properties from `props` onto `obj`.
+ * @returns obj
+ * @private
+ */
+function extend(obj, props) {
+ for (var i in props) {
+ obj[i] = props[i];
+ }return obj;
+}
+
+/** Call a function asynchronously, as soon as possible.
+ * @param {Function} callback
+ */
+var defer = typeof Promise == 'function' ? Promise.resolve().then.bind(Promise.resolve()) : setTimeout;
+
+function cloneElement(vnode, props) {
+ return h(vnode.nodeName, extend(extend({}, vnode.attributes), props), arguments.length > 2 ? [].slice.call(arguments, 2) : vnode.children);
+}
+
+// DOM properties that should NOT have "px" added when numeric
+var IS_NON_DIMENSIONAL = /acit|ex(?:s|g|n|p|$)|rph|ows|mnc|ntw|ine[ch]|zoo|^ord/i;
+
+/** Managed queue of dirty components to be re-rendered */
+
+var items = [];
+
+function enqueueRender(component) {
+ if (!component._dirty && (component._dirty = true) && items.push(component) == 1) {
+ (options.debounceRendering || defer)(rerender);
+ }
+}
+
+function rerender() {
+ var p,
+ list = items;
+ items = [];
+ while (p = list.pop()) {
+ if (p._dirty) renderComponent(p);
+ }
+}
+
+/** Check if two nodes are equivalent.
+ * @param {Element} node
+ * @param {VNode} vnode
+ * @private
+ */
+function isSameNodeType(node, vnode, hydrating) {
+ if (typeof vnode === 'string' || typeof vnode === 'number') {
+ return node.splitText !== undefined;
+ }
+ if (typeof vnode.nodeName === 'string') {
+ return !node._componentConstructor && isNamedNode(node, vnode.nodeName);
+ }
+ return hydrating || node._componentConstructor === vnode.nodeName;
+}
+
+/** Check if an Element has a given normalized name.
+* @param {Element} node
+* @param {String} nodeName
+ */
+function isNamedNode(node, nodeName) {
+ return node.normalizedNodeName === nodeName || node.nodeName.toLowerCase() === nodeName.toLowerCase();
+}
+
+/**
+ * Reconstruct Component-style `props` from a VNode.
+ * Ensures default/fallback values from `defaultProps`:
+ * Own-properties of `defaultProps` not present in `vnode.attributes` are added.
+ * @param {VNode} vnode
+ * @returns {Object} props
+ */
+function getNodeProps(vnode) {
+ var props = extend({}, vnode.attributes);
+ props.children = vnode.children;
+
+ var defaultProps = vnode.nodeName.defaultProps;
+ if (defaultProps !== undefined) {
+ for (var i in defaultProps) {
+ if (props[i] === undefined) {
+ props[i] = defaultProps[i];
+ }
+ }
+ }
+
+ return props;
+}
+
+/** Create an element with the given nodeName.
+ * @param {String} nodeName
+ * @param {Boolean} [isSvg=false] If `true`, creates an element within the SVG namespace.
+ * @returns {Element} node
+ */
+function createNode(nodeName, isSvg) {
+ var node = isSvg ? document.createElementNS('http://www.w3.org/2000/svg', nodeName) : document.createElement(nodeName);
+ node.normalizedNodeName = nodeName;
+ return node;
+}
+
+/** Remove a child node from its parent if attached.
+ * @param {Element} node The node to remove
+ */
+function removeNode(node) {
+ var parentNode = node.parentNode;
+ if (parentNode) parentNode.removeChild(node);
+}
+
+/** Set a named attribute on the given Node, with special behavior for some names and event handlers.
+ * If `value` is `null`, the attribute/handler will be removed.
+ * @param {Element} node An element to mutate
+ * @param {string} name The name/key to set, such as an event or attribute name
+ * @param {any} old The last value that was set for this name/node pair
+ * @param {any} value An attribute value, such as a function to be used as an event handler
+ * @param {Boolean} isSvg Are we currently diffing inside an svg?
+ * @private
+ */
+function setAccessor(node, name, old, value, isSvg) {
+ if (name === 'className') name = 'class';
+
+ if (name === 'key') {
+ // ignore
+ } else if (name === 'ref') {
+ if (old) old(null);
+ if (value) value(node);
+ } else if (name === 'class' && !isSvg) {
+ node.className = value || '';
+ } else if (name === 'style') {
+ if (!value || typeof value === 'string' || typeof old === 'string') {
+ node.style.cssText = value || '';
+ }
+ if (value && typeof value === 'object') {
+ if (typeof old !== 'string') {
+ for (var i in old) {
+ if (!(i in value)) node.style[i] = '';
+ }
+ }
+ for (var i in value) {
+ node.style[i] = typeof value[i] === 'number' && IS_NON_DIMENSIONAL.test(i) === false ? value[i] + 'px' : value[i];
+ }
+ }
+ } else if (name === 'dangerouslySetInnerHTML') {
+ if (value) node.innerHTML = value.__html || '';
+ } else if (name[0] == 'o' && name[1] == 'n') {
+ var useCapture = name !== (name = name.replace(/Capture$/, ''));
+ name = name.toLowerCase().substring(2);
+ if (value) {
+ if (!old) node.addEventListener(name, eventProxy, useCapture);
+ } else {
+ node.removeEventListener(name, eventProxy, useCapture);
+ }
+ (node._listeners || (node._listeners = {}))[name] = value;
+ } else if (name !== 'list' && name !== 'type' && !isSvg && name in node) {
+ setProperty(node, name, value == null ? '' : value);
+ if (value == null || value === false) node.removeAttribute(name);
+ } else {
+ var ns = isSvg && name !== (name = name.replace(/^xlink\:?/, ''));
+ if (value == null || value === false) {
+ if (ns) node.removeAttributeNS('http://www.w3.org/1999/xlink', name.toLowerCase());else node.removeAttribute(name);
+ } else if (typeof value !== 'function') {
+ if (ns) node.setAttributeNS('http://www.w3.org/1999/xlink', name.toLowerCase(), value);else node.setAttribute(name, value);
+ }
+ }
+}
+
+/** Attempt to set a DOM property to the given value.
+ * IE & FF throw for certain property-value combinations.
+ */
+function setProperty(node, name, value) {
+ try {
+ node[name] = value;
+ } catch (e) {}
+}
+
+/** Proxy an event to hooked event handlers
+ * @private
+ */
+function eventProxy(e) {
+ return this._listeners[e.type](options.event && options.event(e) || e);
+}
+
+/** Queue of components that have been mounted and are awaiting componentDidMount */
+var mounts = [];
+
+/** Diff recursion count, used to track the end of the diff cycle. */
+var diffLevel = 0;
+
+/** Global flag indicating if the diff is currently within an SVG */
+var isSvgMode = false;
+
+/** Global flag indicating if the diff is performing hydration */
+var hydrating = false;
+
+/** Invoke queued componentDidMount lifecycle methods */
+function flushMounts() {
+ var c;
+ while (c = mounts.pop()) {
+ if (options.afterMount) options.afterMount(c);
+ if (c.componentDidMount) c.componentDidMount();
+ }
+}
+
+/** Apply differences in a given vnode (and it's deep children) to a real DOM Node.
+ * @param {Element} [dom=null] A DOM node to mutate into the shape of the `vnode`
+ * @param {VNode} vnode A VNode (with descendants forming a tree) representing the desired DOM structure
+ * @returns {Element} dom The created/mutated element
+ * @private
+ */
+function diff(dom, vnode, context, mountAll, parent, componentRoot) {
+ // diffLevel having been 0 here indicates initial entry into the diff (not a subdiff)
+ if (!diffLevel++) {
+ // when first starting the diff, check if we're diffing an SVG or within an SVG
+ isSvgMode = parent != null && parent.ownerSVGElement !== undefined;
+
+ // hydration is indicated by the existing element to be diffed not having a prop cache
+ hydrating = dom != null && !('__preactattr_' in dom);
+ }
+
+ var ret = idiff(dom, vnode, context, mountAll, componentRoot);
+
+ // append the element if its a new parent
+ if (parent && ret.parentNode !== parent) parent.appendChild(ret);
+
+ // diffLevel being reduced to 0 means we're exiting the diff
+ if (! --diffLevel) {
+ hydrating = false;
+ // invoke queued componentDidMount lifecycle methods
+ if (!componentRoot) flushMounts();
+ }
+
+ return ret;
+}
+
+/** Internals of `diff()`, separated to allow bypassing diffLevel / mount flushing. */
+function idiff(dom, vnode, context, mountAll, componentRoot) {
+ var out = dom,
+ prevSvgMode = isSvgMode;
+
+ // empty values (null, undefined, booleans) render as empty Text nodes
+ if (vnode == null || typeof vnode === 'boolean') vnode = '';
+
+ // Fast case: Strings & Numbers create/update Text nodes.
+ if (typeof vnode === 'string' || typeof vnode === 'number') {
+
+ // update if it's already a Text node:
+ if (dom && dom.splitText !== undefined && dom.parentNode && (!dom._component || componentRoot)) {
+ /* istanbul ignore if */ /* Browser quirk that can't be covered: https://github.com/developit/preact/commit/fd4f21f5c45dfd75151bd27b4c217d8003aa5eb9 */
+ if (dom.nodeValue != vnode) {
+ dom.nodeValue = vnode;
+ }
+ } else {
+ // it wasn't a Text node: replace it with one and recycle the old Element
+ out = document.createTextNode(vnode);
+ if (dom) {
+ if (dom.parentNode) dom.parentNode.replaceChild(out, dom);
+ recollectNodeTree(dom, true);
+ }
+ }
+
+ out['__preactattr_'] = true;
+
+ return out;
+ }
+
+ // If the VNode represents a Component, perform a component diff:
+ var vnodeName = vnode.nodeName;
+ if (typeof vnodeName === 'function') {
+ return buildComponentFromVNode(dom, vnode, context, mountAll);
+ }
+
+ // Tracks entering and exiting SVG namespace when descending through the tree.
+ isSvgMode = vnodeName === 'svg' ? true : vnodeName === 'foreignObject' ? false : isSvgMode;
+
+ // If there's no existing element or it's the wrong type, create a new one:
+ vnodeName = String(vnodeName);
+ if (!dom || !isNamedNode(dom, vnodeName)) {
+ out = createNode(vnodeName, isSvgMode);
+
+ if (dom) {
+ // move children into the replacement node
+ while (dom.firstChild) {
+ out.appendChild(dom.firstChild);
+ } // if the previous Element was mounted into the DOM, replace it inline
+ if (dom.parentNode) dom.parentNode.replaceChild(out, dom);
+
+ // recycle the old element (skips non-Element node types)
+ recollectNodeTree(dom, true);
+ }
+ }
+
+ var fc = out.firstChild,
+ props = out['__preactattr_'],
+ vchildren = vnode.children;
+
+ if (props == null) {
+ props = out['__preactattr_'] = {};
+ for (var a = out.attributes, i = a.length; i--;) {
+ props[a[i].name] = a[i].value;
+ }
+ }
+
+ // Optimization: fast-path for elements containing a single TextNode:
+ if (!hydrating && vchildren && vchildren.length === 1 && typeof vchildren[0] === 'string' && fc != null && fc.splitText !== undefined && fc.nextSibling == null) {
+ if (fc.nodeValue != vchildren[0]) {
+ fc.nodeValue = vchildren[0];
+ }
+ }
+ // otherwise, if there are existing or new children, diff them:
+ else if (vchildren && vchildren.length || fc != null) {
+ innerDiffNode(out, vchildren, context, mountAll, hydrating || props.dangerouslySetInnerHTML != null);
+ }
+
+ // Apply attributes/props from VNode to the DOM Element:
+ diffAttributes(out, vnode.attributes, props);
+
+ // restore previous SVG mode: (in case we're exiting an SVG namespace)
+ isSvgMode = prevSvgMode;
+
+ return out;
+}
+
+/** Apply child and attribute changes between a VNode and a DOM Node to the DOM.
+ * @param {Element} dom Element whose children should be compared & mutated
+ * @param {Array} vchildren Array of VNodes to compare to `dom.childNodes`
+ * @param {Object} context Implicitly descendant context object (from most recent `getChildContext()`)
+ * @param {Boolean} mountAll
+ * @param {Boolean} isHydrating If `true`, consumes externally created elements similar to hydration
+ */
+function innerDiffNode(dom, vchildren, context, mountAll, isHydrating) {
+ var originalChildren = dom.childNodes,
+ children = [],
+ keyed = {},
+ keyedLen = 0,
+ min = 0,
+ len = originalChildren.length,
+ childrenLen = 0,
+ vlen = vchildren ? vchildren.length : 0,
+ j,
+ c,
+ f,
+ vchild,
+ child;
+
+ // Build up a map of keyed children and an Array of unkeyed children:
+ if (len !== 0) {
+ for (var i = 0; i < len; i++) {
+ var _child = originalChildren[i],
+ props = _child['__preactattr_'],
+ key = vlen && props ? _child._component ? _child._component.__key : props.key : null;
+ if (key != null) {
+ keyedLen++;
+ keyed[key] = _child;
+ } else if (props || (_child.splitText !== undefined ? isHydrating ? _child.nodeValue.trim() : true : isHydrating)) {
+ children[childrenLen++] = _child;
+ }
+ }
+ }
+
+ if (vlen !== 0) {
+ for (var i = 0; i < vlen; i++) {
+ vchild = vchildren[i];
+ child = null;
+
+ // attempt to find a node based on key matching
+ var key = vchild.key;
+ if (key != null) {
+ if (keyedLen && keyed[key] !== undefined) {
+ child = keyed[key];
+ keyed[key] = undefined;
+ keyedLen--;
+ }
+ }
+ // attempt to pluck a node of the same type from the existing children
+ else if (!child && min < childrenLen) {
+ for (j = min; j < childrenLen; j++) {
+ if (children[j] !== undefined && isSameNodeType(c = children[j], vchild, isHydrating)) {
+ child = c;
+ children[j] = undefined;
+ if (j === childrenLen - 1) childrenLen--;
+ if (j === min) min++;
+ break;
+ }
+ }
+ }
+
+ // morph the matched/found/created DOM child to match vchild (deep)
+ child = idiff(child, vchild, context, mountAll);
+
+ f = originalChildren[i];
+ if (child && child !== dom && child !== f) {
+ if (f == null) {
+ dom.appendChild(child);
+ } else if (child === f.nextSibling) {
+ removeNode(f);
+ } else {
+ dom.insertBefore(child, f);
+ }
+ }
+ }
+ }
+
+ // remove unused keyed children:
+ if (keyedLen) {
+ for (var i in keyed) {
+ if (keyed[i] !== undefined) recollectNodeTree(keyed[i], false);
+ }
+ }
+
+ // remove orphaned unkeyed children:
+ while (min <= childrenLen) {
+ if ((child = children[childrenLen--]) !== undefined) recollectNodeTree(child, false);
+ }
+}
+
+/** Recursively recycle (or just unmount) a node and its descendants.
+ * @param {Node} node DOM node to start unmount/removal from
+ * @param {Boolean} [unmountOnly=false] If `true`, only triggers unmount lifecycle, skips removal
+ */
+function recollectNodeTree(node, unmountOnly) {
+ var component = node._component;
+ if (component) {
+ // if node is owned by a Component, unmount that component (ends up recursing back here)
+ unmountComponent(component);
+ } else {
+ // If the node's VNode had a ref function, invoke it with null here.
+ // (this is part of the React spec, and smart for unsetting references)
+ if (node['__preactattr_'] != null && node['__preactattr_'].ref) node['__preactattr_'].ref(null);
+
+ if (unmountOnly === false || node['__preactattr_'] == null) {
+ removeNode(node);
+ }
+
+ removeChildren(node);
+ }
+}
+
+/** Recollect/unmount all children.
+ * - we use .lastChild here because it causes less reflow than .firstChild
+ * - it's also cheaper than accessing the .childNodes Live NodeList
+ */
+function removeChildren(node) {
+ node = node.lastChild;
+ while (node) {
+ var next = node.previousSibling;
+ recollectNodeTree(node, true);
+ node = next;
+ }
+}
+
+/** Apply differences in attributes from a VNode to the given DOM Element.
+ * @param {Element} dom Element with attributes to diff `attrs` against
+ * @param {Object} attrs The desired end-state key-value attribute pairs
+ * @param {Object} old Current/previous attributes (from previous VNode or element's prop cache)
+ */
+function diffAttributes(dom, attrs, old) {
+ var name;
+
+ // remove attributes no longer present on the vnode by setting them to undefined
+ for (name in old) {
+ if (!(attrs && attrs[name] != null) && old[name] != null) {
+ setAccessor(dom, name, old[name], old[name] = undefined, isSvgMode);
+ }
+ }
+
+ // add new & update changed attributes
+ for (name in attrs) {
+ if (name !== 'children' && name !== 'innerHTML' && (!(name in old) || attrs[name] !== (name === 'value' || name === 'checked' ? dom[name] : old[name]))) {
+ setAccessor(dom, name, old[name], old[name] = attrs[name], isSvgMode);
+ }
+ }
+}
+
+/** Retains a pool of Components for re-use, keyed on component name.
+ * Note: since component names are not unique or even necessarily available, these are primarily a form of sharding.
+ * @private
+ */
+var components = {};
+
+/** Reclaim a component for later re-use by the recycler. */
+function collectComponent(component) {
+ var name = component.constructor.name;
+ (components[name] || (components[name] = [])).push(component);
+}
+
+/** Create a component. Normalizes differences between PFC's and classful Components. */
+function createComponent(Ctor, props, context) {
+ var list = components[Ctor.name],
+ inst;
+
+ if (Ctor.prototype && Ctor.prototype.render) {
+ inst = new Ctor(props, context);
+ Component.call(inst, props, context);
+ } else {
+ inst = new Component(props, context);
+ inst.constructor = Ctor;
+ inst.render = doRender;
+ }
+
+ if (list) {
+ for (var i = list.length; i--;) {
+ if (list[i].constructor === Ctor) {
+ inst.nextBase = list[i].nextBase;
+ list.splice(i, 1);
+ break;
+ }
+ }
+ }
+ return inst;
+}
+
+/** The `.render()` method for a PFC backing instance. */
+function doRender(props, state, context) {
+ return this.constructor(props, context);
+}
+
+/** Set a component's `props` (generally derived from JSX attributes).
+ * @param {Object} props
+ * @param {Object} [opts]
+ * @param {boolean} [opts.renderSync=false] If `true` and {@link options.syncComponentUpdates} is `true`, triggers synchronous rendering.
+ * @param {boolean} [opts.render=true] If `false`, no render will be triggered.
+ */
+function setComponentProps(component, props, opts, context, mountAll) {
+ if (component._disable) return;
+ component._disable = true;
+
+ if (component.__ref = props.ref) delete props.ref;
+ if (component.__key = props.key) delete props.key;
+
+ if (!component.base || mountAll) {
+ if (component.componentWillMount) component.componentWillMount();
+ } else if (component.componentWillReceiveProps) {
+ component.componentWillReceiveProps(props, context);
+ }
+
+ if (context && context !== component.context) {
+ if (!component.prevContext) component.prevContext = component.context;
+ component.context = context;
+ }
+
+ if (!component.prevProps) component.prevProps = component.props;
+ component.props = props;
+
+ component._disable = false;
+
+ if (opts !== 0) {
+ if (opts === 1 || options.syncComponentUpdates !== false || !component.base) {
+ renderComponent(component, 1, mountAll);
+ } else {
+ enqueueRender(component);
+ }
+ }
+
+ if (component.__ref) component.__ref(component);
+}
+
+/** Render a Component, triggering necessary lifecycle events and taking High-Order Components into account.
+ * @param {Component} component
+ * @param {Object} [opts]
+ * @param {boolean} [opts.build=false] If `true`, component will build and store a DOM node if not already associated with one.
+ * @private
+ */
+function renderComponent(component, opts, mountAll, isChild) {
+ if (component._disable) return;
+
+ var props = component.props,
+ state = component.state,
+ context = component.context,
+ previousProps = component.prevProps || props,
+ previousState = component.prevState || state,
+ previousContext = component.prevContext || context,
+ isUpdate = component.base,
+ nextBase = component.nextBase,
+ initialBase = isUpdate || nextBase,
+ initialChildComponent = component._component,
+ skip = false,
+ rendered,
+ inst,
+ cbase;
+
+ // if updating
+ if (isUpdate) {
+ component.props = previousProps;
+ component.state = previousState;
+ component.context = previousContext;
+ if (opts !== 2 && component.shouldComponentUpdate && component.shouldComponentUpdate(props, state, context) === false) {
+ skip = true;
+ } else if (component.componentWillUpdate) {
+ component.componentWillUpdate(props, state, context);
+ }
+ component.props = props;
+ component.state = state;
+ component.context = context;
+ }
+
+ component.prevProps = component.prevState = component.prevContext = component.nextBase = null;
+ component._dirty = false;
+
+ if (!skip) {
+ rendered = component.render(props, state, context);
+
+ // context to pass to the child, can be updated via (grand-)parent component
+ if (component.getChildContext) {
+ context = extend(extend({}, context), component.getChildContext());
+ }
+
+ var childComponent = rendered && rendered.nodeName,
+ toUnmount,
+ base;
+
+ if (typeof childComponent === 'function') {
+ // set up high order component link
+
+ var childProps = getNodeProps(rendered);
+ inst = initialChildComponent;
+
+ if (inst && inst.constructor === childComponent && childProps.key == inst.__key) {
+ setComponentProps(inst, childProps, 1, context, false);
+ } else {
+ toUnmount = inst;
+
+ component._component = inst = createComponent(childComponent, childProps, context);
+ inst.nextBase = inst.nextBase || nextBase;
+ inst._parentComponent = component;
+ setComponentProps(inst, childProps, 0, context, false);
+ renderComponent(inst, 1, mountAll, true);
+ }
+
+ base = inst.base;
+ } else {
+ cbase = initialBase;
+
+ // destroy high order component link
+ toUnmount = initialChildComponent;
+ if (toUnmount) {
+ cbase = component._component = null;
+ }
+
+ if (initialBase || opts === 1) {
+ if (cbase) cbase._component = null;
+ base = diff(cbase, rendered, context, mountAll || !isUpdate, initialBase && initialBase.parentNode, true);
+ }
+ }
+
+ if (initialBase && base !== initialBase && inst !== initialChildComponent) {
+ var baseParent = initialBase.parentNode;
+ if (baseParent && base !== baseParent) {
+ baseParent.replaceChild(base, initialBase);
+
+ if (!toUnmount) {
+ initialBase._component = null;
+ recollectNodeTree(initialBase, false);
+ }
+ }
+ }
+
+ if (toUnmount) {
+ unmountComponent(toUnmount);
+ }
+
+ component.base = base;
+ if (base && !isChild) {
+ var componentRef = component,
+ t = component;
+ while (t = t._parentComponent) {
+ (componentRef = t).base = base;
+ }
+ base._component = componentRef;
+ base._componentConstructor = componentRef.constructor;
+ }
+ }
+
+ if (!isUpdate || mountAll) {
+ mounts.unshift(component);
+ } else if (!skip) {
+ // Ensure that pending componentDidMount() hooks of child components
+ // are called before the componentDidUpdate() hook in the parent.
+ // Note: disabled as it causes duplicate hooks, see https://github.com/developit/preact/issues/750
+ // flushMounts();
+
+ if (component.componentDidUpdate) {
+ component.componentDidUpdate(previousProps, previousState, previousContext);
+ }
+ if (options.afterUpdate) options.afterUpdate(component);
+ }
+
+ if (component._renderCallbacks != null) {
+ while (component._renderCallbacks.length) {
+ component._renderCallbacks.pop().call(component);
+ }
+ }
+
+ if (!diffLevel && !isChild) flushMounts();
+}
+
+/** Apply the Component referenced by a VNode to the DOM.
+ * @param {Element} dom The DOM node to mutate
+ * @param {VNode} vnode A Component-referencing VNode
+ * @returns {Element} dom The created/mutated element
+ * @private
+ */
+function buildComponentFromVNode(dom, vnode, context, mountAll) {
+ var c = dom && dom._component,
+ originalComponent = c,
+ oldDom = dom,
+ isDirectOwner = c && dom._componentConstructor === vnode.nodeName,
+ isOwner = isDirectOwner,
+ props = getNodeProps(vnode);
+ while (c && !isOwner && (c = c._parentComponent)) {
+ isOwner = c.constructor === vnode.nodeName;
+ }
+
+ if (c && isOwner && (!mountAll || c._component)) {
+ setComponentProps(c, props, 3, context, mountAll);
+ dom = c.base;
+ } else {
+ if (originalComponent && !isDirectOwner) {
+ unmountComponent(originalComponent);
+ dom = oldDom = null;
+ }
+
+ c = createComponent(vnode.nodeName, props, context);
+ if (dom && !c.nextBase) {
+ c.nextBase = dom;
+ // passing dom/oldDom as nextBase will recycle it if unused, so bypass recycling on L229:
+ oldDom = null;
+ }
+ setComponentProps(c, props, 1, context, mountAll);
+ dom = c.base;
+
+ if (oldDom && dom !== oldDom) {
+ oldDom._component = null;
+ recollectNodeTree(oldDom, false);
+ }
+ }
+
+ return dom;
+}
+
+/** Remove a component from the DOM and recycle it.
+ * @param {Component} component The Component instance to unmount
+ * @private
+ */
+function unmountComponent(component) {
+ if (options.beforeUnmount) options.beforeUnmount(component);
+
+ var base = component.base;
+
+ component._disable = true;
+
+ if (component.componentWillUnmount) component.componentWillUnmount();
+
+ component.base = null;
+
+ // recursively tear down & recollect high-order component children:
+ var inner = component._component;
+ if (inner) {
+ unmountComponent(inner);
+ } else if (base) {
+ if (base['__preactattr_'] && base['__preactattr_'].ref) base['__preactattr_'].ref(null);
+
+ component.nextBase = base;
+
+ removeNode(base);
+ collectComponent(component);
+
+ removeChildren(base);
+ }
+
+ if (component.__ref) component.__ref(null);
+}
+
+/** Base Component class.
+ * Provides `setState()` and `forceUpdate()`, which trigger rendering.
+ * @public
+ *
+ * @example
+ * class MyFoo extends Component {
+ * render(props, state) {
+ * return ;
+ * }
+ * }
+ */
+function Component(props, context) {
+ this._dirty = true;
+
+ /** @public
+ * @type {object}
+ */
+ this.context = context;
+
+ /** @public
+ * @type {object}
+ */
+ this.props = props;
+
+ /** @public
+ * @type {object}
+ */
+ this.state = this.state || {};
+}
+
+extend(Component.prototype, {
+
+ /** Returns a `boolean` indicating if the component should re-render when receiving the given `props` and `state`.
+ * @param {object} nextProps
+ * @param {object} nextState
+ * @param {object} nextContext
+ * @returns {Boolean} should the component re-render
+ * @name shouldComponentUpdate
+ * @function
+ */
+
+ /** Update component state by copying properties from `state` to `this.state`.
+ * @param {object} state A hash of state properties to update with new values
+ * @param {function} callback A function to be called once component state is updated
+ */
+ setState: function setState(state, callback) {
+ var s = this.state;
+ if (!this.prevState) this.prevState = extend({}, s);
+ extend(s, typeof state === 'function' ? state(s, this.props) : state);
+ if (callback) (this._renderCallbacks = this._renderCallbacks || []).push(callback);
+ enqueueRender(this);
+ },
+
+
+ /** Immediately perform a synchronous re-render of the component.
+ * @param {function} callback A function to be called after component is re-rendered.
+ * @private
+ */
+ forceUpdate: function forceUpdate(callback) {
+ if (callback) (this._renderCallbacks = this._renderCallbacks || []).push(callback);
+ renderComponent(this, 2);
+ },
+
+
+ /** Accepts `props` and `state`, and returns a new Virtual DOM tree to build.
+ * Virtual DOM is generally constructed via [JSX](http://jasonformat.com/wtf-is-jsx).
+ * @param {object} props Props (eg: JSX attributes) received from parent element/component
+ * @param {object} state The component's current state
+ * @param {object} context Context object (if a parent component has provided context)
+ * @returns VNode
+ */
+ render: function render() {}
+});
+
+/** Render JSX into a `parent` Element.
+ * @param {VNode} vnode A (JSX) VNode to render
+ * @param {Element} parent DOM element to render into
+ * @param {Element} [merge] Attempt to re-use an existing DOM tree rooted at `merge`
+ * @public
+ *
+ * @example
+ * // render a div into :
+ * render(hello!
, document.body);
+ *
+ * @example
+ * // render a "Thing" component into #foo:
+ * const Thing = ({ name }) => { name };
+ * render(, document.querySelector('#foo'));
+ */
+function render(vnode, parent, merge) {
+ return diff(merge, vnode, {}, false, parent, false);
+}
+
+var preact = {
+ h: h,
+ createElement: h,
+ cloneElement: cloneElement,
+ Component: Component,
+ render: render,
+ rerender: rerender,
+ options: options
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (preact);
+//# sourceMappingURL=preact.esm.js.map
+
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(6);
+__webpack_require__(7);
+module.exports = __webpack_require__(8);
+
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports) {
+
+(function(self) {
+ 'use strict';
+
+ if (self.fetch) {
+ return
+ }
+
+ var support = {
+ searchParams: 'URLSearchParams' in self,
+ iterable: 'Symbol' in self && 'iterator' in Symbol,
+ blob: 'FileReader' in self && 'Blob' in self && (function() {
+ try {
+ new Blob()
+ return true
+ } catch(e) {
+ return false
+ }
+ })(),
+ formData: 'FormData' in self,
+ arrayBuffer: 'ArrayBuffer' in self
+ }
+
+ if (support.arrayBuffer) {
+ var viewClasses = [
+ '[object Int8Array]',
+ '[object Uint8Array]',
+ '[object Uint8ClampedArray]',
+ '[object Int16Array]',
+ '[object Uint16Array]',
+ '[object Int32Array]',
+ '[object Uint32Array]',
+ '[object Float32Array]',
+ '[object Float64Array]'
+ ]
+
+ var isDataView = function(obj) {
+ return obj && DataView.prototype.isPrototypeOf(obj)
+ }
+
+ var isArrayBufferView = ArrayBuffer.isView || function(obj) {
+ return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1
+ }
+ }
+
+ function normalizeName(name) {
+ if (typeof name !== 'string') {
+ name = String(name)
+ }
+ if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) {
+ throw new TypeError('Invalid character in header field name')
+ }
+ return name.toLowerCase()
+ }
+
+ function normalizeValue(value) {
+ if (typeof value !== 'string') {
+ value = String(value)
+ }
+ return value
+ }
+
+ // Build a destructive iterator for the value list
+ function iteratorFor(items) {
+ var iterator = {
+ next: function() {
+ var value = items.shift()
+ return {done: value === undefined, value: value}
+ }
+ }
+
+ if (support.iterable) {
+ iterator[Symbol.iterator] = function() {
+ return iterator
+ }
+ }
+
+ return iterator
+ }
+
+ function Headers(headers) {
+ this.map = {}
+
+ if (headers instanceof Headers) {
+ headers.forEach(function(value, name) {
+ this.append(name, value)
+ }, this)
+ } else if (Array.isArray(headers)) {
+ headers.forEach(function(header) {
+ this.append(header[0], header[1])
+ }, this)
+ } else if (headers) {
+ Object.getOwnPropertyNames(headers).forEach(function(name) {
+ this.append(name, headers[name])
+ }, this)
+ }
+ }
+
+ Headers.prototype.append = function(name, value) {
+ name = normalizeName(name)
+ value = normalizeValue(value)
+ var oldValue = this.map[name]
+ this.map[name] = oldValue ? oldValue+','+value : value
+ }
+
+ Headers.prototype['delete'] = function(name) {
+ delete this.map[normalizeName(name)]
+ }
+
+ Headers.prototype.get = function(name) {
+ name = normalizeName(name)
+ return this.has(name) ? this.map[name] : null
+ }
+
+ Headers.prototype.has = function(name) {
+ return this.map.hasOwnProperty(normalizeName(name))
+ }
+
+ Headers.prototype.set = function(name, value) {
+ this.map[normalizeName(name)] = normalizeValue(value)
+ }
+
+ Headers.prototype.forEach = function(callback, thisArg) {
+ for (var name in this.map) {
+ if (this.map.hasOwnProperty(name)) {
+ callback.call(thisArg, this.map[name], name, this)
+ }
+ }
+ }
+
+ Headers.prototype.keys = function() {
+ var items = []
+ this.forEach(function(value, name) { items.push(name) })
+ return iteratorFor(items)
+ }
+
+ Headers.prototype.values = function() {
+ var items = []
+ this.forEach(function(value) { items.push(value) })
+ return iteratorFor(items)
+ }
+
+ Headers.prototype.entries = function() {
+ var items = []
+ this.forEach(function(value, name) { items.push([name, value]) })
+ return iteratorFor(items)
+ }
+
+ if (support.iterable) {
+ Headers.prototype[Symbol.iterator] = Headers.prototype.entries
+ }
+
+ function consumed(body) {
+ if (body.bodyUsed) {
+ return Promise.reject(new TypeError('Already read'))
+ }
+ body.bodyUsed = true
+ }
+
+ function fileReaderReady(reader) {
+ return new Promise(function(resolve, reject) {
+ reader.onload = function() {
+ resolve(reader.result)
+ }
+ reader.onerror = function() {
+ reject(reader.error)
+ }
+ })
+ }
+
+ function readBlobAsArrayBuffer(blob) {
+ var reader = new FileReader()
+ var promise = fileReaderReady(reader)
+ reader.readAsArrayBuffer(blob)
+ return promise
+ }
+
+ function readBlobAsText(blob) {
+ var reader = new FileReader()
+ var promise = fileReaderReady(reader)
+ reader.readAsText(blob)
+ return promise
+ }
+
+ function readArrayBufferAsText(buf) {
+ var view = new Uint8Array(buf)
+ var chars = new Array(view.length)
+
+ for (var i = 0; i < view.length; i++) {
+ chars[i] = String.fromCharCode(view[i])
+ }
+ return chars.join('')
+ }
+
+ function bufferClone(buf) {
+ if (buf.slice) {
+ return buf.slice(0)
+ } else {
+ var view = new Uint8Array(buf.byteLength)
+ view.set(new Uint8Array(buf))
+ return view.buffer
+ }
+ }
+
+ function Body() {
+ this.bodyUsed = false
+
+ this._initBody = function(body) {
+ this._bodyInit = body
+ if (!body) {
+ this._bodyText = ''
+ } else if (typeof body === 'string') {
+ this._bodyText = body
+ } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
+ this._bodyBlob = body
+ } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
+ this._bodyFormData = body
+ } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
+ this._bodyText = body.toString()
+ } else if (support.arrayBuffer && support.blob && isDataView(body)) {
+ this._bodyArrayBuffer = bufferClone(body.buffer)
+ // IE 10-11 can't handle a DataView body.
+ this._bodyInit = new Blob([this._bodyArrayBuffer])
+ } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {
+ this._bodyArrayBuffer = bufferClone(body)
+ } else {
+ throw new Error('unsupported BodyInit type')
+ }
+
+ if (!this.headers.get('content-type')) {
+ if (typeof body === 'string') {
+ this.headers.set('content-type', 'text/plain;charset=UTF-8')
+ } else if (this._bodyBlob && this._bodyBlob.type) {
+ this.headers.set('content-type', this._bodyBlob.type)
+ } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
+ this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')
+ }
+ }
+ }
+
+ if (support.blob) {
+ this.blob = function() {
+ var rejected = consumed(this)
+ if (rejected) {
+ return rejected
+ }
+
+ if (this._bodyBlob) {
+ return Promise.resolve(this._bodyBlob)
+ } else if (this._bodyArrayBuffer) {
+ return Promise.resolve(new Blob([this._bodyArrayBuffer]))
+ } else if (this._bodyFormData) {
+ throw new Error('could not read FormData body as blob')
+ } else {
+ return Promise.resolve(new Blob([this._bodyText]))
+ }
+ }
+
+ this.arrayBuffer = function() {
+ if (this._bodyArrayBuffer) {
+ return consumed(this) || Promise.resolve(this._bodyArrayBuffer)
+ } else {
+ return this.blob().then(readBlobAsArrayBuffer)
+ }
+ }
+ }
+
+ this.text = function() {
+ var rejected = consumed(this)
+ if (rejected) {
+ return rejected
+ }
+
+ if (this._bodyBlob) {
+ return readBlobAsText(this._bodyBlob)
+ } else if (this._bodyArrayBuffer) {
+ return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))
+ } else if (this._bodyFormData) {
+ throw new Error('could not read FormData body as text')
+ } else {
+ return Promise.resolve(this._bodyText)
+ }
+ }
+
+ if (support.formData) {
+ this.formData = function() {
+ return this.text().then(decode)
+ }
+ }
+
+ this.json = function() {
+ return this.text().then(JSON.parse)
+ }
+
+ return this
+ }
+
+ // HTTP methods whose capitalization should be normalized
+ var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']
+
+ function normalizeMethod(method) {
+ var upcased = method.toUpperCase()
+ return (methods.indexOf(upcased) > -1) ? upcased : method
+ }
+
+ function Request(input, options) {
+ options = options || {}
+ var body = options.body
+
+ if (input instanceof Request) {
+ if (input.bodyUsed) {
+ throw new TypeError('Already read')
+ }
+ this.url = input.url
+ this.credentials = input.credentials
+ if (!options.headers) {
+ this.headers = new Headers(input.headers)
+ }
+ this.method = input.method
+ this.mode = input.mode
+ if (!body && input._bodyInit != null) {
+ body = input._bodyInit
+ input.bodyUsed = true
+ }
+ } else {
+ this.url = String(input)
+ }
+
+ this.credentials = options.credentials || this.credentials || 'omit'
+ if (options.headers || !this.headers) {
+ this.headers = new Headers(options.headers)
+ }
+ this.method = normalizeMethod(options.method || this.method || 'GET')
+ this.mode = options.mode || this.mode || null
+ this.referrer = null
+
+ if ((this.method === 'GET' || this.method === 'HEAD') && body) {
+ throw new TypeError('Body not allowed for GET or HEAD requests')
+ }
+ this._initBody(body)
+ }
+
+ Request.prototype.clone = function() {
+ return new Request(this, { body: this._bodyInit })
+ }
+
+ function decode(body) {
+ var form = new FormData()
+ body.trim().split('&').forEach(function(bytes) {
+ if (bytes) {
+ var split = bytes.split('=')
+ var name = split.shift().replace(/\+/g, ' ')
+ var value = split.join('=').replace(/\+/g, ' ')
+ form.append(decodeURIComponent(name), decodeURIComponent(value))
+ }
+ })
+ return form
+ }
+
+ function parseHeaders(rawHeaders) {
+ var headers = new Headers()
+ rawHeaders.split(/\r?\n/).forEach(function(line) {
+ var parts = line.split(':')
+ var key = parts.shift().trim()
+ if (key) {
+ var value = parts.join(':').trim()
+ headers.append(key, value)
+ }
+ })
+ return headers
+ }
+
+ Body.call(Request.prototype)
+
+ function Response(bodyInit, options) {
+ if (!options) {
+ options = {}
+ }
+
+ this.type = 'default'
+ this.status = 'status' in options ? options.status : 200
+ this.ok = this.status >= 200 && this.status < 300
+ this.statusText = 'statusText' in options ? options.statusText : 'OK'
+ this.headers = new Headers(options.headers)
+ this.url = options.url || ''
+ this._initBody(bodyInit)
+ }
+
+ Body.call(Response.prototype)
+
+ Response.prototype.clone = function() {
+ return new Response(this._bodyInit, {
+ status: this.status,
+ statusText: this.statusText,
+ headers: new Headers(this.headers),
+ url: this.url
+ })
+ }
+
+ Response.error = function() {
+ var response = new Response(null, {status: 0, statusText: ''})
+ response.type = 'error'
+ return response
+ }
+
+ var redirectStatuses = [301, 302, 303, 307, 308]
+
+ Response.redirect = function(url, status) {
+ if (redirectStatuses.indexOf(status) === -1) {
+ throw new RangeError('Invalid status code')
+ }
+
+ return new Response(null, {status: status, headers: {location: url}})
+ }
+
+ self.Headers = Headers
+ self.Request = Request
+ self.Response = Response
+
+ self.fetch = function(input, init) {
+ return new Promise(function(resolve, reject) {
+ var request = new Request(input, init)
+ var xhr = new XMLHttpRequest()
+
+ xhr.onload = function() {
+ var options = {
+ status: xhr.status,
+ statusText: xhr.statusText,
+ headers: parseHeaders(xhr.getAllResponseHeaders() || '')
+ }
+ options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')
+ var body = 'response' in xhr ? xhr.response : xhr.responseText
+ resolve(new Response(body, options))
+ }
+
+ xhr.onerror = function() {
+ reject(new TypeError('Network request failed'))
+ }
+
+ xhr.ontimeout = function() {
+ reject(new TypeError('Network request failed'))
+ }
+
+ xhr.open(request.method, request.url, true)
+
+ if (request.credentials === 'include') {
+ xhr.withCredentials = true
+ }
+
+ if ('responseType' in xhr && support.blob) {
+ xhr.responseType = 'blob'
+ }
+
+ request.headers.forEach(function(value, name) {
+ xhr.setRequestHeader(name, value)
+ })
+
+ xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)
+ })
+ }
+ self.fetch.polyfill = true
+})(typeof self !== 'undefined' ? self : this);
+
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+/**
+ * @author Timur Kuzhagaliyev
+ * @copyright 2017
+ * @license GPL-3.0
+ */
+
+var Akko = __webpack_require__(9);
+var Visualiser = __webpack_require__(1);
+var Visualisers = __webpack_require__(3);
+
+module.exports = Akko;
+module.exports.Visualiser = Visualiser;
+module.exports.visualisers = Visualisers;
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+/**
+ * @author Timur Kuzhagaliyev
+ * @copyright 2017
+ * @license GPL-3.0
+ */
+
+var THREE = __webpack_require__(0);
+
+var MusicPlayer = __webpack_require__(2);
+var VisualisationCore = __webpack_require__(12);
+var UI = __webpack_require__(17);
+
+/**
+ * @type {{containerId: string, useDefaultVisualisers: boolean, autoPlay: boolean}}
+ */
+var defaultOptions = {
+ containerId: 'akko',
+ useDefaultVisualisers: true,
+ autoPlay: false
+};
+
+/**
+ * @return {{containerId: string, useDefaultVisualisers: boolean, autoPlay: boolean}}
+ */
+var mergeOptions = function mergeOptions() {
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ var result = {};
+ for (var key in defaultOptions) {
+ if (!defaultOptions.hasOwnProperty(key)) continue;
+ result[key] = options[key] !== undefined ? options[key] : defaultOptions[key];
+ }
+ return result;
+};
+
+var Akko = function () {
+ function Akko(options) {
+ _classCallCheck(this, Akko);
+
+ if (!THREE) throw new Error('Akko could not find three.js (`THREE`)!');
+ if (!window) throw new Error('Akko could not find `window` variable! Are you running Akko in browser?');
+ if (!document) throw new Error('Akko could not find `document` variable! Are you running Akko in browser?');
+
+ this.AudioContext = window.AudioContext || window.webkitAudioContext;
+ if (!this.AudioContext) throw new Error('Akko could not find `AudioContext`! Is it supported in your browser?');
+
+ this.options = mergeOptions(options);
+
+ this.container = document.getElementById(this.options.containerId);
+ if (!this.container) throw new Error('Could not find element with ID \'' + this.options.containerId + '\'!');
+
+ this.musicPlayer = new MusicPlayer({
+ audioContext: new this.AudioContext(),
+ autoPlay: options.autoPlay
+ });
+ this.visCore = new VisualisationCore({
+ parentElement: this.container,
+ useDefaultVisualisers: this.options.useDefaultVisualisers,
+ analyser: this.musicPlayer.getAnalyser()
+ });
+ }
+
+ _createClass(Akko, [{
+ key: 'start',
+ value: function start() {
+ this.bootstrapUI();
+ this.visCore.prepare();
+ this.visCore.useVisualiser(0);
+ this.musicPlayer.start();
+ this.visCore.start();
+ this.setupListeners();
+ }
+ }, {
+ key: 'bootstrapUI',
+ value: function bootstrapUI() {
+ this.ui = new UI({
+ container: this.container,
+ musicPlayer: this.musicPlayer,
+ visCore: this.visCore
+ });
+ this.ui.start();
+ }
+
+ /**
+ * @param {Visualiser} visualiser
+ */
+
+ }, {
+ key: 'addVisualiser',
+ value: function addVisualiser(visualiser) {
+ this.visCore.addVisualiser(visualiser);
+ }
+
+ /**
+ * @param {string|File|ArrayBuffer} source
+ * @param {string} [title]
+ */
+
+ }, {
+ key: 'addTrack',
+ value: function addTrack(source, title) {
+ this.musicPlayer.addTrack(source, title);
+ }
+
+ /**
+ * @private
+ */
+
+ }, {
+ key: 'setupListeners',
+ value: function setupListeners() {
+ if (window.File && window.FileReader && window.FileList && window.Blob) {
+ this.container.addEventListener('dragover', this.onDragOver.bind(this), false);
+ this.container.addEventListener('drop', this.onDrop.bind(this), false);
+ } else {
+ console.warn('The File APIs are not fully supported your browser. Drag & drop disabled in Akko.');
+ }
+ }
+
+ /**
+ * @private
+ */
+
+ }, {
+ key: 'onDragOver',
+ value: function onDragOver(event) {
+ event.stopPropagation();
+ event.preventDefault();
+ event.dataTransfer.dropEffect = 'copy';
+ }
+
+ /**
+ * @private
+ */
+
+ }, {
+ key: 'onDrop',
+ value: function onDrop(event) {
+ event.stopPropagation();
+ event.preventDefault();
+ var files = event.dataTransfer.files;
+
+ for (var i = 0; i < files.length; i++) {
+ var file = files[i];
+ if (file.type.match(/audio.*/)) {
+ this.musicPlayer.addTrack(file);
+ }
+ }
+ }
+ }]);
+
+ return Akko;
+}();
+
+module.exports = Akko;
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports) {
+
+module.exports = Promise;
+
+/***/ }),
+/* 11 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+/**
+ * @author Timur Kuzhagaliyev
+ * @copyright 2017
+ * @license GPL-3.0
+ */
+
+var SourceTypes = {
+ URL: 'url',
+ FILE: 'file',
+ ARRAY_BUFFER: 'arrayBuffer'
+};
+
+var Track = function () {
+
+ /**
+ * @param {object} data
+ * @param {string|File} data.source
+ * @param {string} [data.title]
+ */
+ function Track(data) {
+ _classCallCheck(this, Track);
+
+ this.source = data.source;
+ this.title = data.title;
+ this.arrayBufferCache = null;
+ this.analyseSource();
+ }
+
+ _createClass(Track, [{
+ key: 'analyseSource',
+ value: function analyseSource() {
+ if (typeof this.source === 'string') {
+ this.sourceType = SourceTypes.URL;
+ this.title = this.title || decodeURIComponent(this.source.split('/').pop().replace(/\.[a-zA-Z0-9]+$/, ''));
+ } else if (this.source instanceof File) {
+ this.sourceType = SourceTypes.FILE;
+ this.title = this.title || this.source.name.replace(/\.[a-zA-Z0-9]+$/, '');
+ } else if (this.source instanceof ArrayBuffer) {
+ this.sourceType = SourceTypes.ARRAY_BUFFER;
+ this.title = this.title || 'Untitled';
+ } else {
+ throw new Error('\'Unsupported Track source type: ' + this.source);
+ }
+ }
+
+ /**
+ * @return {Promise.}
+ */
+
+ }, {
+ key: 'prepareArrayBuffer',
+ value: function prepareArrayBuffer() {
+ var _this = this;
+
+ if (this.arrayBufferCache) return Promise.resolve(this.arrayBufferCache);
+ switch (this.sourceType) {
+ case SourceTypes.URL:
+ return window.fetch(this.source).then(function (response) {
+ var arrayBuffer = response.arrayBuffer();
+ _this.arrayBufferCache = arrayBuffer;
+ return arrayBuffer;
+ });
+ case SourceTypes.FILE:
+ return new Promise(function (resolve, reject) {
+ var reader = new window.FileReader();
+ reader.onload = function (fileEvent) {
+ var arrayBuffer = fileEvent.target.result;
+ _this.arrayBufferCache = arrayBuffer;
+ resolve(arrayBuffer);
+ };
+ reader.onerror = function (error) {
+ reject(error);
+ };
+ reader.readAsArrayBuffer(_this.source);
+ });
+ case SourceTypes.ARRAY_BUFFER:
+ return Promise.resolve(this.source);
+ default:
+ return Promise.reject(new Error('\'Unsupported track source type: ' + this.sourceType));
+ }
+ }
+ }]);
+
+ return Track;
+}();
+
+module.exports = Track;
+module.exports.SourceTypes = SourceTypes;
+
+/***/ }),
+/* 12 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+/**
+ * @author Timur Kuzhagaliyev
+ * @copyright 2017
+ * @license GPL-3.0
+ */
+
+var THREE = __webpack_require__(0);
+var elementResizeEvent = __webpack_require__(13);
+
+var Visualisers = __webpack_require__(3);
+
+var VisualisationCore = function () {
+
+ /**
+ * @param {object} data
+ * @param {Element} data.parentElement
+ * @param {boolean} data.useDefaultVisualisers
+ * @param {object} data.analyser
+ */
+ function VisualisationCore(data) {
+ _classCallCheck(this, VisualisationCore);
+
+ this.parentElement = data.parentElement;
+
+ this.frequencyDataArray = null;
+ this.analyser = data.analyser;
+
+ /**
+ * @callback visualiserListener
+ * @param {Track[]} visualisers
+ * @param {int} currentVisualiserIndex
+ */
+ /** @type {visualiserListener[]} */
+ this.listeners = [];
+
+ this.visualisers = data.useDefaultVisualisers ? this.prepareDefaultVisualisers() : [];
+ this.currentVisualiserIndex = -1;
+ }
+
+ _createClass(VisualisationCore, [{
+ key: 'prepareDefaultVisualisers',
+ value: function prepareDefaultVisualisers() {
+ var visualisers = [];
+ for (var key in Visualisers) {
+ if (!Visualisers.hasOwnProperty(key)) continue;
+ var visualiserClass = Visualisers[key];
+ visualisers.push(new visualiserClass());
+ }
+ return visualisers;
+ }
+ }, {
+ key: 'notifyListeners',
+ value: function notifyListeners() {
+ for (var i = 0; i < this.listeners.length; i++) {
+ var listener = this.listeners[i];
+ listener(this.visualisers, this.currentVisualiserIndex);
+ }
+ }
+
+ /**
+ * @param {visualiserListener} listener
+ */
+
+ }, {
+ key: 'addListener',
+ value: function addListener(listener) {
+ this.listeners.push(listener);
+ this.notifyListeners();
+ }
+
+ /**
+ * @param {Visualiser} visualiser
+ */
+
+ }, {
+ key: 'addVisualiser',
+ value: function addVisualiser(visualiser) {
+ this.visualisers.push(visualiser);
+ this.notifyListeners();
+ }
+ }, {
+ key: 'prepare',
+ value: function prepare() {
+ var width = this.parentElement.offsetWidth;
+ var height = this.parentElement.offsetHeight;
+
+ this.renderer = new THREE.WebGLRenderer();
+ this.renderer.setSize(width, height);
+ this.canvas = this.renderer.domElement;
+ this.parentElement.appendChild(this.canvas);
+ }
+ }, {
+ key: 'start',
+ value: function start() {
+ this.setupListeners();
+ this.renderLoop();
+ this.notifyListeners();
+ }
+
+ /**
+ * @param {int} index
+ */
+
+ }, {
+ key: 'useVisualiser',
+ value: function useVisualiser(index) {
+ var visualiser = this.visualisers[index];
+ if (visualiser) this.prepareVisualiser(visualiser);
+ if (this.visualiser) this.visualiser.pause();
+ this.currentVisualiserIndex = index;
+ this.visualiser = visualiser;
+ this.notifyListeners();
+ }
+
+ /**
+ * @param {Visualiser} visualiser
+ */
+
+ }, {
+ key: 'prepareVisualiser',
+ value: function prepareVisualiser(visualiser) {
+ this.analyser.fftSize = visualiser.fftSize;
+ this.analyser.smoothingTimeConstant = visualiser.smoothingTimeConstant;
+ this.frequencyDataArray = new Float32Array(this.analyser.frequencyBinCount);
+ this.timeDomainDataArray = new Float32Array(this.analyser.frequencyBinCount);
+ var data = {
+ renderer: this.renderer,
+ analyser: this.analyser,
+ width: this.canvas.clientWidth,
+ height: this.canvas.clientHeight
+ };
+ if (!visualiser.isInitialised()) visualiser.init(data);else if (visualiser.isPaused()) visualiser.revive(data);
+ visualiser.resize(data);
+ }
+ }, {
+ key: 'setupListeners',
+ value: function setupListeners() {
+ elementResizeEvent(this.parentElement, this.onParentResize.bind(this));
+ }
+ }, {
+ key: 'renderLoop',
+ value: function renderLoop() {
+ var _this = this;
+
+ if (this.visualiser) {
+ if (this.analyser) {
+ this.analyser.getFloatFrequencyData(this.frequencyDataArray);
+ this.analyser.getFloatTimeDomainData(this.timeDomainDataArray);
+ }
+ this.visualiser.update({
+ renderer: this.renderer,
+ analyser: this.analyser,
+ frequencyData: this.frequencyDataArray,
+ timeDomainData: this.timeDomainDataArray
+ });
+ } else {
+ // TODO: Display warning about no visualiser
+ }
+ setTimeout(function () {
+ requestAnimationFrame(_this.renderLoop.bind(_this));
+ }, 1000 / 30);
+ }
+ }, {
+ key: 'onParentResize',
+ value: function onParentResize() {
+ var width = this.parentElement.offsetWidth;
+ var height = this.parentElement.offsetHeight;
+ this.renderer.setSize(width, height);
+ if (this.visualiser) this.visualiser.resize({
+ renderer: this.renderer,
+ width: width,
+ height: height
+ });
+ }
+ }]);
+
+ return VisualisationCore;
+}();
+
+module.exports = VisualisationCore;
+
+/***/ }),
+/* 13 */
+/***/ (function(module, exports) {
+
+var requestFrame = (function () {
+ var window = this
+ var raf = window.requestAnimationFrame ||
+ window.mozRequestAnimationFrame ||
+ window.webkitRequestAnimationFrame ||
+ function fallbackRAF(func) {
+ return window.setTimeout(func, 20)
+ }
+ return function requestFrameFunction(func) {
+ return raf(func)
+ }
+})()
+
+var cancelFrame = (function () {
+ var window = this
+ var cancel = window.cancelAnimationFrame ||
+ window.mozCancelAnimationFrame ||
+ window.webkitCancelAnimationFrame ||
+ window.clearTimeout
+ return function cancelFrameFunction(id) {
+ return cancel(id)
+ }
+})()
+
+function resizeListener(e) {
+ var win = e.target || e.srcElement
+ if (win.__resizeRAF__) {
+ cancelFrame(win.__resizeRAF__)
+ }
+ win.__resizeRAF__ = requestFrame(function () {
+ var trigger = win.__resizeTrigger__
+ trigger.__resizeListeners__.forEach(function (fn) {
+ fn.call(trigger, e)
+ })
+ })
+}
+
+var exports = function exports(element, fn) {
+ var window = this
+ var document = window.document
+ var isIE
+
+ var attachEvent = document.attachEvent
+ if (typeof navigator !== 'undefined') {
+ isIE = navigator.userAgent.match(/Trident/) ||
+ navigator.userAgent.match(/Edge/)
+ }
+
+ function objectLoad() {
+ this.contentDocument.defaultView.__resizeTrigger__ = this.__resizeElement__
+ this.contentDocument.defaultView.addEventListener('resize', resizeListener)
+ }
+
+ if (!element.__resizeListeners__) {
+ element.__resizeListeners__ = []
+ if (attachEvent) {
+ element.__resizeTrigger__ = element
+ element.attachEvent('onresize', resizeListener)
+ } else {
+ if (getComputedStyle(element).position === 'static') {
+ element.style.position = 'relative'
+ }
+ var obj = (element.__resizeTrigger__ = document.createElement('object'))
+ obj.setAttribute(
+ 'style',
+ 'display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden; pointer-events: none; z-index: -1; opacity: 0;'
+ )
+ obj.setAttribute('class', 'resize-sensor')
+ obj.__resizeElement__ = element
+ obj.onload = objectLoad
+ obj.type = 'text/html'
+ if (isIE) {
+ element.appendChild(obj)
+ }
+ obj.data = 'about:blank'
+ if (!isIE) {
+ element.appendChild(obj)
+ }
+ }
+ }
+ element.__resizeListeners__.push(fn)
+}
+
+module.exports = typeof window === 'undefined' ? exports : exports.bind(window)
+
+module.exports.unbind = function (element, fn) {
+ var attachEvent = document.attachEvent
+ if (fn) {
+ element.__resizeListeners__.splice(
+ element.__resizeListeners__.indexOf(fn),
+ 1
+ )
+ } else {
+ element.__resizeListeners__ = []
+ }
+ if (!element.__resizeListeners__.length) {
+ if (attachEvent) {
+ element.detachEvent('onresize', resizeListener)
+ } else {
+ element.__resizeTrigger__.contentDocument.defaultView.removeEventListener(
+ 'resize',
+ resizeListener
+ )
+ delete element.__resizeTrigger__.contentDocument.defaultView.__resizeTrigger__
+ element.__resizeTrigger__ = !element.removeChild(
+ element.__resizeTrigger__
+ )
+ }
+ delete element.__resizeListeners__
+ }
+}
+
+
+/***/ }),
+/* 14 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * @author Timur Kuzhagaliyev
+ * @copyright 2017
+ * @license GPL-3.0
+ */
+
+var THREE = __webpack_require__(0);
+var Visualiser = __webpack_require__(1);
+
+var BAR_COUNT = 32;
+
+var BarVisualiser = function (_Visualiser) {
+ _inherits(BarVisualiser, _Visualiser);
+
+ function BarVisualiser() {
+ _classCallCheck(this, BarVisualiser);
+
+ return _possibleConstructorReturn(this, (BarVisualiser.__proto__ || Object.getPrototypeOf(BarVisualiser)).call(this, {
+ code: 'Ba',
+ name: 'Bars 3D',
+ fftSize: BAR_COUNT * 2,
+ smoothingTimeConstant: 0.9
+ }));
+ }
+
+ _createClass(BarVisualiser, [{
+ key: 'onInit',
+ value: function onInit(data) {
+ this.setupSceneAndCamera(data);
+ this.setupLights(data);
+ this.setupPlane(data);
+ this.setupBars(data);
+ }
+ }, {
+ key: 'setupSceneAndCamera',
+ value: function setupSceneAndCamera(data) {
+ this.scene = new THREE.Scene();
+ this.camera = new THREE.PerspectiveCamera(60, data.width / data.height, 0.1, 100);
+ this.camera.position.set(0, 15, 17);
+ this.camera.rotation.x = -Math.PI / 4;
+ this.cameraPivot = new THREE.Object3D();
+ this.cameraPivot.add(this.camera);
+ this.cameraPivot.castShadow = true;
+ this.scene.add(this.cameraPivot);
+ }
+ }, {
+ key: 'setupLights',
+ value: function setupLights() {
+ var ambientLight = new THREE.AmbientLight(0x404040, 0.8);
+ this.scene.add(ambientLight);
+ }
+ }, {
+ key: 'setupPlane',
+ value: function setupPlane() {
+ var planeGeometry = new THREE.PlaneGeometry(200, 200, 1);
+ var planeMaterial = new THREE.MeshPhongMaterial({ color: 0x444444, side: THREE.DoubleSide });
+ var plane = new THREE.Mesh(planeGeometry, planeMaterial);
+ plane.receiveShadow = true;
+ plane.rotation.x = Math.PI / 2;
+ this.scene.add(plane);
+ }
+ }, {
+ key: 'setupBars',
+ value: function setupBars() {
+ this.bars = [];
+ this.lights = [];
+ this.cubeLights = [];
+ var step = 2 * Math.PI / BAR_COUNT;
+ var geometry = new THREE.BoxGeometry(0.5, 10, 0.5);
+ var radius = 5;
+ for (var i = 0; i < BAR_COUNT; i++) {
+ var color = 0xff0000 + i * 5;
+ var bar = new THREE.Object3D();
+ var material = new THREE.MeshLambertMaterial({ color: color });
+ var cube = new THREE.Mesh(geometry, material);
+ var cubeLight = new THREE.PointLight(color, 0, 4);
+ cubeLight.position.y = 7;
+ cubeLight.position.x = -1;
+ cube.add(cubeLight);
+ var light = new THREE.PointLight(color, 0, 10);
+ light.position.y = 1;
+ light.position.x = 10;
+ bar.add(light);
+ bar.add(cube);
+ bar.position.x = radius;
+ cube.position.y = -4.8;
+ var pivot = new THREE.Object3D();
+ pivot.rotation.y = step * i;
+ pivot.add(bar);
+ this.scene.add(pivot);
+ this.bars.push(cube);
+ this.lights.push(light);
+ this.cubeLights.push(cubeLight);
+ }
+ }
+ }, {
+ key: 'onUpdate',
+ value: function onUpdate(data) {
+ for (var i = 0; i < BAR_COUNT; i++) {
+ var bar = this.bars[i];
+ var light = this.lights[i];
+ var cubeLight = this.cubeLights[i];
+ var frequency = Math.abs(data.frequencyData[i]);
+ var timeDomain = data.timeDomainData[i];
+
+ var value = frequency * timeDomain;
+ if (value === Infinity || value === -Infinity) continue;
+ var newY = bar.position.y + (value - bar.position.y) / 30;
+ if (isNaN(newY)) continue;
+
+ light.intensity = Math.max(0, newY);
+ cubeLight.intensity = Math.max(0, newY) * 0.5;
+ bar.position.y = newY;
+ }
+ this.cameraPivot.rotation.y += 0.01;
+ data.renderer.render(this.scene, this.camera);
+ }
+ }, {
+ key: 'onResize',
+ value: function onResize(data) {
+ this.camera.aspect = data.width / data.height;
+ this.camera.updateProjectionMatrix();
+ }
+ }, {
+ key: 'onDestroy',
+ value: function onDestroy() {
+ delete this.scene;
+ delete this.camera;
+ }
+ }]);
+
+ return BarVisualiser;
+}(Visualiser);
+
+module.exports = BarVisualiser;
+
+/***/ }),
+/* 15 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+/**
+ * @author Timur Kuzhagaliyev
+ * @copyright 2017
+ * @license GPL-3.0
+ */
+
+var Helper = function () {
+ function Helper() {
+ _classCallCheck(this, Helper);
+ }
+
+ _createClass(Helper, [{
+ key: "lerp",
+ value: function lerp(current, target, fraction) {
+ if (isNaN(target) || target === Infinity || target === -Infinity) return current;
+ return current + (target - current) * fraction;
+ }
+ }, {
+ key: "constrain",
+ value: function constrain(max, min, value) {
+ return Math.min(max, Math.max(min, value));
+ }
+ }]);
+
+ return Helper;
+}();
+
+module.exports = Helper;
+
+/***/ }),
+/* 16 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * @author Timur Kuzhagaliyev
+ * @copyright 2017
+ * @license GPL-3.0
+ */
+
+var THREE = __webpack_require__(0);
+var Visualiser = __webpack_require__(1);
+
+var RING_COUNT = 16;
+
+var RingVisualiser = function (_Visualiser) {
+ _inherits(RingVisualiser, _Visualiser);
+
+ function RingVisualiser() {
+ _classCallCheck(this, RingVisualiser);
+
+ return _possibleConstructorReturn(this, (RingVisualiser.__proto__ || Object.getPrototypeOf(RingVisualiser)).call(this, {
+ code: 'Rn',
+ name: 'Rings 2D',
+ fftSize: RING_COUNT * 2,
+ smoothingTimeConstant: 0.9
+ }));
+ }
+
+ _createClass(RingVisualiser, [{
+ key: 'onInit',
+ value: function onInit(data) {
+ this.setupSceneAndCamera(data);
+ this.setupRings();
+ }
+ }, {
+ key: 'setupSceneAndCamera',
+ value: function setupSceneAndCamera(data) {
+ this.scene = new THREE.Scene();
+
+ this.camera = new THREE.PerspectiveCamera(60, data.width / data.height, 0.1, 100);
+ this.camera.position.z = 20;
+ this.camera.lookAt(new THREE.Vector3(0, 0, 0));
+ this.scene.add(this.camera);
+ }
+ }, {
+ key: 'setupRings',
+ value: function setupRings() {
+ this.rings = [];
+ var hslStep = 1 / RING_COUNT;
+ for (var i = 0; i < RING_COUNT; i++) {
+ var radius = 2 + i;
+ var segments = 64;
+ var material = new THREE.LineBasicMaterial({ color: 0x0000ff * i });
+ material.color.setHSL(hslStep * i, 1, 0.5);
+ var geometry = new THREE.CircleGeometry(radius, segments);
+ var ring = new THREE.Line(geometry, material);
+ this.scene.add(ring);
+ this.rings.push(ring);
+ }
+ }
+ }, {
+ key: 'onUpdate',
+ value: function onUpdate(data) {
+ for (var i = 0; i < RING_COUNT; i++) {
+ var ring = this.rings[i];
+ var timeDomain = data.timeDomainData[i];
+ var frequency = Math.abs(data.frequencyData[i]);
+ var scale = this.lerp(ring.scale.x, frequency * timeDomain, 0.01);
+ scale = this.constrain(2, 0.5, scale);
+ ring.scale.set(scale, scale, scale);
+ ring.rotation.z += 0.002 * i;
+ }
+ data.renderer.render(this.scene, this.camera);
+ }
+ }, {
+ key: 'onResize',
+ value: function onResize(data) {
+ this.camera.aspect = data.width / data.height;
+ this.camera.updateProjectionMatrix();
+ }
+ }, {
+ key: 'onDestroy',
+ value: function onDestroy() {
+ delete this.scene;
+ delete this.camera;
+ }
+ }]);
+
+ return RingVisualiser;
+}(Visualiser);
+
+module.exports = RingVisualiser;
+
+/***/ }),
+/* 17 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+/**
+ * @author Timur Kuzhagaliyev
+ * @copyright 2017
+ * @license GPL-3.0
+ */
+
+// eslint-disable-next-line
+var _require = __webpack_require__(4),
+ render = _require.render,
+ h = _require.h;
+// eslint-disable-next-line
+
+
+var UIComponent = __webpack_require__(18);
+
+var UI = function () {
+
+ /**
+ * @param {object} data
+ * @param {Element} data.container
+ * @param {MusicPlayer} data.musicPlayer
+ * @param {VisualisationCore} data.visCore
+ */
+ function UI(data) {
+ _classCallCheck(this, UI);
+
+ this.container = data.container;
+ this.musicPlayer = data.musicPlayer;
+ this.visCore = data.visCore;
+ }
+
+ _createClass(UI, [{
+ key: 'start',
+ value: function start() {
+ render(h(UIComponent, { musicPlayer: this.musicPlayer, visCore: this.visCore }), this.container);
+ }
+ }]);
+
+ return UI;
+}();
+
+module.exports = UI;
+
+/***/ }),
+/* 18 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * @author Timur Kuzhagaliyev
+ * @copyright 2017
+ * @license GPL-3.0
+ */
+
+// eslint-disable-next-line
+var _require = __webpack_require__(4),
+ Component = _require.Component,
+ h = _require.h;
+
+var PlayerStates = __webpack_require__(2).States;
+
+var UIComponent = function (_Component) {
+ _inherits(UIComponent, _Component);
+
+ function UIComponent(props) {
+ _classCallCheck(this, UIComponent);
+
+ var _this = _possibleConstructorReturn(this, (UIComponent.__proto__ || Object.getPrototypeOf(UIComponent)).call(this, props));
+
+ _this.state = {
+ playerState: null,
+ trackList: [],
+ currentTrackIndex: null,
+ visualisers: [],
+ currentVisualiserIndex: null
+ };
+ props.musicPlayer.addListener(_this.playbackListener.bind(_this));
+ props.visCore.addListener(_this.visualiserListener.bind(_this));
+ return _this;
+ }
+
+ _createClass(UIComponent, [{
+ key: 'playbackListener',
+ value: function playbackListener(playerState, trackList, currentTrackIndex) {
+ this.setState({
+ playerState: playerState,
+ trackList: trackList,
+ currentTrackIndex: currentTrackIndex
+ });
+ }
+ }, {
+ key: 'visualiserListener',
+ value: function visualiserListener(visualisers, currentVisualiserIndex) {
+ this.setState({
+ visualisers: visualisers,
+ currentVisualiserIndex: currentVisualiserIndex
+ });
+ }
+ }, {
+ key: 'playTrack',
+ value: function playTrack(index, event) {
+ event.preventDefault();
+ this.props.musicPlayer.playTrack(index);
+ }
+ }, {
+ key: 'togglePlayback',
+ value: function togglePlayback(event) {
+ event.preventDefault();
+ var state = this.state;
+ state.playing = this.props.musicPlayer.togglePlayback();
+ this.setState(state);
+ }
+ }, {
+ key: 'addTrackByUrl',
+ value: function addTrackByUrl(event) {
+ event.preventDefault();
+ var audioUrl = prompt('Enter the URL of an audio file');
+ if (audioUrl) {
+ this.props.musicPlayer.addTrack(audioUrl);
+ }
+ }
+ }, {
+ key: 'uploadAudioFile',
+ value: function uploadAudioFile(event) {
+ event.preventDefault();
+ if (!this.fileInput) return;
+ if (!this.fileInput.onchange) this.fileInput.onchange = this.addAudioFile.bind(this);
+ this.fileInput.click();
+ }
+ }, {
+ key: 'addAudioFile',
+ value: function addAudioFile() {
+ var files = this.fileInput.files;
+ for (var i = 0; i < files.length; i++) {
+ var file = files[i];
+ if (file.type.match(/audio.*/)) {
+ this.props.musicPlayer.addTrack(file);
+ }
+ }
+ }
+ }, {
+ key: 'getTrackList',
+ value: function getTrackList() {
+ var trackList = this.state.trackList;
+ if (trackList) {
+ var trackComponents = [];
+ for (var i = 0; i < trackList.length; i++) {
+ var track = trackList[i];
+ var isActive = this.state.currentTrackIndex === i;
+ var activeClass = isActive ? 'active' : '';
+ var symbol = isActive ? this.getPlaybackSymbol() : '#' + (i + 1);
+ trackComponents.push(h(
+ 'a',
+ { href: '#', alt: 'Play track #' + (i + 1), onClick: this.playTrack.bind(this, i),
+ className: 'akko-ui-container-list-item ' + activeClass },
+ h(
+ 'span',
+ null,
+ symbol
+ ),
+ ' ',
+ track.title
+ ));
+ }
+ return h(
+ 'div',
+ { className: 'akko-ui-container-list' },
+ trackComponents
+ );
+ } else {
+ return null;
+ }
+ }
+ }, {
+ key: 'getPlaybackSymbol',
+ value: function getPlaybackSymbol() {
+ return !this.isPlaying() ? '❚❚' : '►';
+ }
+ }, {
+ key: 'getPlaybackButtonSymbol',
+ value: function getPlaybackButtonSymbol() {
+ return this.isPlaying() ? '❚❚' : '►';
+ }
+ }, {
+ key: 'isPlaying',
+ value: function isPlaying() {
+ return this.state.playerState === PlayerStates.PLAYING;
+ }
+ }, {
+ key: 'useVisualiser',
+ value: function useVisualiser(index, event) {
+ event.preventDefault();
+ this.props.visCore.useVisualiser(index);
+ }
+ }, {
+ key: 'getVisualiserList',
+ value: function getVisualiserList() {
+ var visualisers = this.state.visualisers;
+ if (visualisers) {
+ var visualiserComponents = [];
+ for (var i = 0; i < visualisers.length; i++) {
+ var visualiser = visualisers[i];
+ var isActive = this.state.currentVisualiserIndex === i;
+ var activeClass = isActive ? 'active' : '';
+ var symbol = visualiser.code;
+ visualiserComponents.push(h(
+ 'a',
+ { href: '#', alt: 'Use visualiser #' + (i + 1),
+ onClick: this.useVisualiser.bind(this, i),
+ className: 'akko-ui-container-list-item ' + activeClass },
+ h(
+ 'span',
+ null,
+ symbol
+ ),
+ ' ',
+ visualiser.name
+ ));
+ }
+ return h(
+ 'div',
+ { className: 'akko-ui-container-list' },
+ visualiserComponents
+ );
+ } else {
+ return null;
+ }
+ }
+ }, {
+ key: 'render',
+ value: function render() {
+ var _this2 = this;
+
+ return h(
+ 'div',
+ { className: 'akko-ui' },
+ h(
+ 'div',
+ { className: 'akko-ui-container akko-ui-tracks' },
+ h(
+ 'div',
+ { className: 'akko-ui-container-title' },
+ 'Player: ',
+ this.state.playerState
+ ),
+ this.getTrackList(),
+ h(
+ 'div',
+ { className: 'akko-ui-add-tracks' },
+ h('input', { ref: function ref(input) {
+ return _this2.fileInput = input;
+ }, type: 'file', style: 'display: none;' }),
+ h(
+ 'a',
+ { href: '#', alt: 'Add a track by URL', onClick: this.addTrackByUrl.bind(this) },
+ 'Add track by URL'
+ ),
+ ' or ',
+ h(
+ 'a',
+ { href: '#', alt: 'Upload an audio file', onClick: this.uploadAudioFile.bind(this) },
+ 'upload audio file'
+ ),
+ h('br', null),
+ 'or drag & drop a file into the visualiser.'
+ )
+ ),
+ h(
+ 'div',
+ { className: 'akko-ui-container akko-ui-visualisers' },
+ h(
+ 'div',
+ { className: 'akko-ui-container-title' },
+ 'Visualisers'
+ ),
+ this.getVisualiserList()
+ ),
+ h(
+ 'div',
+ { className: 'akko-ui-controls' },
+ h(
+ 'a',
+ { href: '#', alt: 'Toggle playback', onClick: this.togglePlayback.bind(this),
+ className: 'akko-ui-controls-play ' + (this.isPlaying() ? 'active' : '') },
+ this.getPlaybackButtonSymbol()
+ ),
+ h(
+ 'div',
+ { className: 'akko-ui-controls-progress' },
+ h('div', { className: 'akko-ui-controls-progress-indicator' })
+ ),
+ h('div', { className: 'akko-ui-controls-volume' })
+ )
+ );
+ }
+ }]);
+
+ return UIComponent;
+}(Component);
+
+module.exports = UIComponent;
+
+/***/ })
+/******/ ]);
\ No newline at end of file
diff --git a/dist/akko.js.patched b/dist/akko.js.patched
new file mode 100644
index 0000000..aa7b304
--- /dev/null
+++ b/dist/akko.js.patched
@@ -0,0 +1,3222 @@
+/*! Akko v0.1.0 | (c) Timur Kuzhagaliyev | github.com/TimboKZ/Akko */
+var Akko =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 5);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports) {
+
+module.exports = THREE;
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * @author Timur Kuzhagaliyev
+ * @copyright 2017
+ * @license GPL-3.0
+ */
+
+var Helper = __webpack_require__(15);
+
+/**
+ * @abstract
+ */
+
+var Visualiser = function (_Helper) {
+ _inherits(Visualiser, _Helper);
+
+ /**
+ * @param {object} data
+ * @param {string} data.code
+ * @param {string} data.name
+ * @param {int} data.fftSize
+ * @param {number} data.smoothingTimeConstant
+ */
+ function Visualiser(data) {
+ _classCallCheck(this, Visualiser);
+
+ var _this = _possibleConstructorReturn(this, (Visualiser.__proto__ || Object.getPrototypeOf(Visualiser)).call(this));
+
+ _this.code = data.code || 'UV';
+ _this.name = data.name || 'Untitled Visualiser';
+ _this.fftSize = data.fftSize || 128;
+ _this.smoothingTimeConstant = data.smoothingTimeConstant || 0;
+ _this.initialised = false;
+ _this.paused = false;
+ return _this;
+ }
+
+ /**
+ * @param {object} data
+ * @param {THREE.WebGLRenderer} data.renderer
+ * @param {AnalyserNode} data.analyser
+ * @param {number} data.height
+ * @param {number} data.width
+ */
+
+
+ _createClass(Visualiser, [{
+ key: 'init',
+ value: function init(data) {
+ this.onInit(data);
+ this.initialised = true;
+ }
+
+ /**
+ * @abstract
+ * @param {object} data
+ * @param {THREE.WebGLRenderer} data.renderer
+ * @param {AnalyserNode} data.analyser
+ * @param {number} data.height
+ * @param {number} data.width
+ */
+ // eslint-disable-next-line
+
+ }, {
+ key: 'onInit',
+ value: function onInit(data) {
+ throw new Error('The \'onInit\' method was not defined on ' + this.name + '!');
+ }
+
+ /**
+ * @param {object} data
+ * @param {THREE.WebGLRenderer} data.renderer
+ * @param {AnalyserNode} data.analyser
+ * @param {number} data.height
+ * @param {number} data.width
+ */
+
+ }, {
+ key: 'revive',
+ value: function revive(data) {
+ this.onRevive(data);
+ this.paused = false;
+ }
+
+ /**
+ * @abstract
+ * @param {object} data
+ * @param {THREE.WebGLRenderer} data.renderer
+ * @param {AnalyserNode} data.analyser
+ * @param {number} data.height
+ * @param {number} data.width
+ */
+ // eslint-disable-next-line
+
+ }, {
+ key: 'onRevive',
+ value: function onRevive(data) {}
+
+ /**
+ * @param {object} data
+ * @param {THREE.WebGLRenderer} data.renderer
+ * @param {AnalyserNode} data.analyser
+ * @param {Float32Array} data.frequencyData
+ * @param {Float32Array} data.timeDomainData
+ */
+
+ }, {
+ key: 'update',
+ value: function update(data) {
+ this.onUpdate(data);
+ }
+
+ /**
+ * @abstract
+ * @param {object} data
+ * @param {THREE.WebGLRenderer} data.renderer
+ * @param {AnalyserNode} data.analyser
+ * @param {Float32Array} data.frequencyData
+ * @param {Float32Array} data.timeDomainData
+ */
+ // eslint-disable-next-line
+
+ }, {
+ key: 'onUpdate',
+ value: function onUpdate(data) {
+ throw new Error('The \'onUpdate\' method was not defined on ' + this.name + '!');
+ }
+
+ /**
+ * @param {THREE.WebGLRenderer} data.renderer
+ * @param {AnalyserNode} data.analyser
+ * @param {number} data.height
+ * @param {number} data.width
+ */
+
+ }, {
+ key: 'resize',
+ value: function resize(data) {
+ this.onResize(data);
+ }
+
+ /**
+ * @abstract
+ * @param {THREE.WebGLRenderer} data.renderer
+ * @param {AnalyserNode} data.analyser
+ * @param {number} data.height
+ * @param {number} data.width
+ */
+ // eslint-disable-next-line
+
+ }, {
+ key: 'onResize',
+ value: function onResize(data) {}
+ }, {
+ key: 'pause',
+ value: function pause() {
+ this.onPause();
+ this.paused = true;
+ }
+
+ /**
+ * @abstract
+ */
+
+ }, {
+ key: 'onPause',
+ value: function onPause() {}
+ }, {
+ key: 'destroy',
+ value: function destroy() {
+ this.onDestroy();
+ }
+
+ /**
+ * @abstract
+ */
+
+ }, {
+ key: 'onDestroy',
+ value: function onDestroy() {
+ throw new Error('The \'onDestroy\' method was not defined on ' + this.name + '!');
+ }
+ }, {
+ key: 'error',
+ value: function error(message) {
+ // TODO: Draw error message on canvas
+ throw new Error(message);
+ }
+ }, {
+ key: 'isInitialised',
+ value: function isInitialised() {
+ return this.initialised;
+ }
+ }, {
+ key: 'isPaused',
+ value: function isPaused() {
+ return this.paused;
+ }
+ }]);
+
+ return Visualiser;
+}(Helper);
+
+module.exports = Visualiser;
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+/**
+ * @author Timur Kuzhagaliyev
+ * @copyright 2017
+ * @license GPL-3.0
+ */
+
+var Promise = __webpack_require__(10);
+var Track = __webpack_require__(11);
+
+var PlayerStates = {
+ LOADING: 'Loading...',
+ READY: 'Ready!',
+ PLAYING: 'Playing...',
+ PAUSED: 'Paused.',
+ FINISHED: 'Finished!'
+};
+
+var MusicPlayer = function () {
+
+ /**
+ * @param data
+ * @param {AudioContext} data.audioContext
+ * @param {boolean} data.autoPlay
+ */
+ function MusicPlayer(data) {
+ _classCallCheck(this, MusicPlayer);
+
+ this.context = data.audioContext;
+ this.autoPlay = data.autoPlay;
+ this.gain = this.context.createGain();
+ this.gain.connect(this.context.destination);
+ this.analyser = this.context.createAnalyser();
+ this.analyser.connect(this.context.destination);
+
+ this.buffer = null;
+ this.sourceNode = this.context.createBufferSource();
+ this.startedAt = 0;
+ this.pausedAt = 0;
+ this.playing = false;
+
+ /**
+ * @callback playbackListener
+ * @param {string} playerState
+ * @param {Track[]} trackList
+ * @param {int} currentTrackIndex
+ */
+ /** @type {playbackListener[]} */
+ this.listeners = [];
+
+ /** @type {Track[]} */
+ this.trackList = [];
+ this.currentTrackIndex = -1;
+
+ this.setState(PlayerStates.READY);
+ }
+
+ _createClass(MusicPlayer, [{
+ key: 'setState',
+ value: function setState(newState) {
+ this.state = newState;
+ this.notifyListeners();
+ }
+ }, {
+ key: 'notifyListeners',
+ value: function notifyListeners() {
+ for (var i = 0; i < this.listeners.length; i++) {
+ var listener = this.listeners[i];
+ listener(this.state, this.trackList, this.currentTrackIndex);
+ }
+ }
+
+ /**
+ * @param {playbackListener} listener
+ */
+
+ }, {
+ key: 'addListener',
+ value: function addListener(listener) {
+ this.listeners.push(listener);
+ }
+ }, {
+ key: 'start',
+ value: function start() {
+ this.setState(PlayerStates.READY);
+ if (this.autoPlay) this.playNextTrack();
+ this.started = true;
+ }
+
+ /**
+ * @param {int} [currentTrackIndex] Current track index override
+ */
+
+ }, {
+ key: 'playNextTrack',
+ value: function playNextTrack(currentTrackIndex) {
+ var currentIndex = currentTrackIndex || this.currentTrackIndex;
+ var nextTrackIndex = currentIndex + 1;
+ if (nextTrackIndex >= this.trackList.length) {
+ return this.setState(PlayerStates.FINISHED);
+ }
+ this.playTrack(nextTrackIndex);
+ }
+ }, {
+ key: 'playTrack',
+ value: function playTrack(index) {
+ var _this = this;
+
+ this.setState(PlayerStates.LOADING);
+ var track = this.trackList[index];
+ Promise.resolve().then(function () {
+ return track.prepareArrayBuffer();
+ }).then(function (arrayBuffer) {
+ // Clone the array buffer to prevent detachment
+ var clonedBuffer = arrayBuffer.slice(0);
+
+ // Use promise-based decodeAudioData with proper error handling
+ return new Promise(function(resolve, reject) {
+ _this.context.decodeAudioData(
+ clonedBuffer,
+ resolve,
+ reject
+ );
+ });
+ }).then(function (audioBuffer) {
+ _this.buffer = audioBuffer;
+ _this.stop();
+ _this.play();
+ _this.currentTrackIndex = index;
+ _this.setState(PlayerStates.PLAYING);
+ }).catch(function (error) {
+ console.error('Error preparing track:', error);
+ console.warn('Skipping \'' + track.title + '\'!');
+ return _this.playNextTrack(index);
+ });
+ }
+ }, {
+ key: 'togglePlayback',
+ value: function togglePlayback() {
+ if (this.playing) {
+ this.pause();
+ } else {
+ if (this.buffer === null) this.playNextTrack();else this.play();
+ }
+ return this.playing;
+ }
+ }, {
+ key: 'play',
+ value: function play() {
+ var offset = this.pausedAt;
+ this.sourceNode = this.context.createBufferSource();
+ this.sourceNode.connect(this.gain);
+ this.sourceNode.connect(this.analyser);
+ this.sourceNode.buffer = this.buffer;
+ this.sourceNode.onended = this.ended.bind(this);
+ this.sourceNode.start(0, offset);
+ this.startedAt = this.context.currentTime - offset;
+ this.pausedAt = 0;
+ this.playing = true;
+ this.setState(PlayerStates.PLAYING);
+ }
+ }, {
+ key: 'pause',
+ value: function pause() {
+ if (!this.playing) return;
+ var elapsed = this.context.currentTime - this.startedAt;
+ this.stop();
+ this.pausedAt = elapsed;
+ this.setState(PlayerStates.PAUSED);
+ }
+ }, {
+ key: 'stop',
+ value: function stop() {
+ if (!this.playing) return;
+ if (this.sourceNode) {
+ this.sourceNode.disconnect();
+ this.sourceNode.stop(0);
+ this.sourceNode = null;
+ }
+ this.pausedAt = 0;
+ this.startedAt = 0;
+ this.playing = false;
+ }
+ }, {
+ key: 'ended',
+ value: function ended() {
+ this.playNextTrack();
+ }
+ }, {
+ key: 'addTrack',
+ value: function addTrack(source, title) {
+ var track = new Track({
+ source: source,
+ title: title
+ });
+ var length = this.trackList.push(track);
+ this.notifyListeners();
+ if (this.started) this.playTrack(length - 1);
+ }
+ }, {
+ key: 'getAnalyser',
+ value: function getAnalyser() {
+ return this.analyser;
+ }
+ }]);
+
+ return MusicPlayer;
+}();
+
+module.exports = MusicPlayer;
+module.exports.States = PlayerStates;
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+/**
+ * @author Timur Kuzhagaliyev
+ * @copyright 2017
+ * @license GPL-3.0
+ */
+
+module.exports = {
+ BarVisualiser: __webpack_require__(14),
+ RingVisualiser: __webpack_require__(16)
+};
+
+/***/ }),
+/* 4 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "h", function() { return h; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createElement", function() { return h; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cloneElement", function() { return cloneElement; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Component", function() { return Component; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "render", function() { return render; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rerender", function() { return rerender; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "options", function() { return options; });
+/** Virtual DOM Node */
+function VNode() {}
+
+/** Global options
+ * @public
+ * @namespace options {Object}
+ */
+var options = {
+
+ /** If `true`, `prop` changes trigger synchronous component updates.
+ * @name syncComponentUpdates
+ * @type Boolean
+ * @default true
+ */
+ //syncComponentUpdates: true,
+
+ /** Processes all created VNodes.
+ * @param {VNode} vnode A newly-created VNode to normalize/process
+ */
+ //vnode(vnode) { }
+
+ /** Hook invoked after a component is mounted. */
+ // afterMount(component) { }
+
+ /** Hook invoked after the DOM is updated with a component's latest render. */
+ // afterUpdate(component) { }
+
+ /** Hook invoked immediately before a component is unmounted. */
+ // beforeUnmount(component) { }
+};
+
+var stack = [];
+
+var EMPTY_CHILDREN = [];
+
+/** JSX/hyperscript reviver
+* Benchmarks: https://esbench.com/bench/57ee8f8e330ab09900a1a1a0
+ * @see http://jasonformat.com/wtf-is-jsx
+ * @public
+ */
+function h(nodeName, attributes) {
+ var children = EMPTY_CHILDREN,
+ lastSimple,
+ child,
+ simple,
+ i;
+ for (i = arguments.length; i-- > 2;) {
+ stack.push(arguments[i]);
+ }
+ if (attributes && attributes.children != null) {
+ if (!stack.length) stack.push(attributes.children);
+ delete attributes.children;
+ }
+ while (stack.length) {
+ if ((child = stack.pop()) && child.pop !== undefined) {
+ for (i = child.length; i--;) {
+ stack.push(child[i]);
+ }
+ } else {
+ if (typeof child === 'boolean') child = null;
+
+ if (simple = typeof nodeName !== 'function') {
+ if (child == null) child = '';else if (typeof child === 'number') child = String(child);else if (typeof child !== 'string') simple = false;
+ }
+
+ if (simple && lastSimple) {
+ children[children.length - 1] += child;
+ } else if (children === EMPTY_CHILDREN) {
+ children = [child];
+ } else {
+ children.push(child);
+ }
+
+ lastSimple = simple;
+ }
+ }
+
+ var p = new VNode();
+ p.nodeName = nodeName;
+ p.children = children;
+ p.attributes = attributes == null ? undefined : attributes;
+ p.key = attributes == null ? undefined : attributes.key;
+
+ // if a "vnode hook" is defined, pass every created VNode to it
+ if (options.vnode !== undefined) options.vnode(p);
+
+ return p;
+}
+
+/** Copy own-properties from `props` onto `obj`.
+ * @returns obj
+ * @private
+ */
+function extend(obj, props) {
+ for (var i in props) {
+ obj[i] = props[i];
+ }return obj;
+}
+
+/** Call a function asynchronously, as soon as possible.
+ * @param {Function} callback
+ */
+var defer = typeof Promise == 'function' ? Promise.resolve().then.bind(Promise.resolve()) : setTimeout;
+
+function cloneElement(vnode, props) {
+ return h(vnode.nodeName, extend(extend({}, vnode.attributes), props), arguments.length > 2 ? [].slice.call(arguments, 2) : vnode.children);
+}
+
+// DOM properties that should NOT have "px" added when numeric
+var IS_NON_DIMENSIONAL = /acit|ex(?:s|g|n|p|$)|rph|ows|mnc|ntw|ine[ch]|zoo|^ord/i;
+
+/** Managed queue of dirty components to be re-rendered */
+
+var items = [];
+
+function enqueueRender(component) {
+ if (!component._dirty && (component._dirty = true) && items.push(component) == 1) {
+ (options.debounceRendering || defer)(rerender);
+ }
+}
+
+function rerender() {
+ var p,
+ list = items;
+ items = [];
+ while (p = list.pop()) {
+ if (p._dirty) renderComponent(p);
+ }
+}
+
+/** Check if two nodes are equivalent.
+ * @param {Element} node
+ * @param {VNode} vnode
+ * @private
+ */
+function isSameNodeType(node, vnode, hydrating) {
+ if (typeof vnode === 'string' || typeof vnode === 'number') {
+ return node.splitText !== undefined;
+ }
+ if (typeof vnode.nodeName === 'string') {
+ return !node._componentConstructor && isNamedNode(node, vnode.nodeName);
+ }
+ return hydrating || node._componentConstructor === vnode.nodeName;
+}
+
+/** Check if an Element has a given normalized name.
+* @param {Element} node
+* @param {String} nodeName
+ */
+function isNamedNode(node, nodeName) {
+ return node.normalizedNodeName === nodeName || node.nodeName.toLowerCase() === nodeName.toLowerCase();
+}
+
+/**
+ * Reconstruct Component-style `props` from a VNode.
+ * Ensures default/fallback values from `defaultProps`:
+ * Own-properties of `defaultProps` not present in `vnode.attributes` are added.
+ * @param {VNode} vnode
+ * @returns {Object} props
+ */
+function getNodeProps(vnode) {
+ var props = extend({}, vnode.attributes);
+ props.children = vnode.children;
+
+ var defaultProps = vnode.nodeName.defaultProps;
+ if (defaultProps !== undefined) {
+ for (var i in defaultProps) {
+ if (props[i] === undefined) {
+ props[i] = defaultProps[i];
+ }
+ }
+ }
+
+ return props;
+}
+
+/** Create an element with the given nodeName.
+ * @param {String} nodeName
+ * @param {Boolean} [isSvg=false] If `true`, creates an element within the SVG namespace.
+ * @returns {Element} node
+ */
+function createNode(nodeName, isSvg) {
+ var node = isSvg ? document.createElementNS('http://www.w3.org/2000/svg', nodeName) : document.createElement(nodeName);
+ node.normalizedNodeName = nodeName;
+ return node;
+}
+
+/** Remove a child node from its parent if attached.
+ * @param {Element} node The node to remove
+ */
+function removeNode(node) {
+ var parentNode = node.parentNode;
+ if (parentNode) parentNode.removeChild(node);
+}
+
+/** Set a named attribute on the given Node, with special behavior for some names and event handlers.
+ * If `value` is `null`, the attribute/handler will be removed.
+ * @param {Element} node An element to mutate
+ * @param {string} name The name/key to set, such as an event or attribute name
+ * @param {any} old The last value that was set for this name/node pair
+ * @param {any} value An attribute value, such as a function to be used as an event handler
+ * @param {Boolean} isSvg Are we currently diffing inside an svg?
+ * @private
+ */
+function setAccessor(node, name, old, value, isSvg) {
+ if (name === 'className') name = 'class';
+
+ if (name === 'key') {
+ // ignore
+ } else if (name === 'ref') {
+ if (old) old(null);
+ if (value) value(node);
+ } else if (name === 'class' && !isSvg) {
+ node.className = value || '';
+ } else if (name === 'style') {
+ if (!value || typeof value === 'string' || typeof old === 'string') {
+ node.style.cssText = value || '';
+ }
+ if (value && typeof value === 'object') {
+ if (typeof old !== 'string') {
+ for (var i in old) {
+ if (!(i in value)) node.style[i] = '';
+ }
+ }
+ for (var i in value) {
+ node.style[i] = typeof value[i] === 'number' && IS_NON_DIMENSIONAL.test(i) === false ? value[i] + 'px' : value[i];
+ }
+ }
+ } else if (name === 'dangerouslySetInnerHTML') {
+ if (value) node.innerHTML = value.__html || '';
+ } else if (name[0] == 'o' && name[1] == 'n') {
+ var useCapture = name !== (name = name.replace(/Capture$/, ''));
+ name = name.toLowerCase().substring(2);
+ if (value) {
+ if (!old) node.addEventListener(name, eventProxy, useCapture);
+ } else {
+ node.removeEventListener(name, eventProxy, useCapture);
+ }
+ (node._listeners || (node._listeners = {}))[name] = value;
+ } else if (name !== 'list' && name !== 'type' && !isSvg && name in node) {
+ setProperty(node, name, value == null ? '' : value);
+ if (value == null || value === false) node.removeAttribute(name);
+ } else {
+ var ns = isSvg && name !== (name = name.replace(/^xlink\:?/, ''));
+ if (value == null || value === false) {
+ if (ns) node.removeAttributeNS('http://www.w3.org/1999/xlink', name.toLowerCase());else node.removeAttribute(name);
+ } else if (typeof value !== 'function') {
+ if (ns) node.setAttributeNS('http://www.w3.org/1999/xlink', name.toLowerCase(), value);else node.setAttribute(name, value);
+ }
+ }
+}
+
+/** Attempt to set a DOM property to the given value.
+ * IE & FF throw for certain property-value combinations.
+ */
+function setProperty(node, name, value) {
+ try {
+ node[name] = value;
+ } catch (e) {}
+}
+
+/** Proxy an event to hooked event handlers
+ * @private
+ */
+function eventProxy(e) {
+ return this._listeners[e.type](options.event && options.event(e) || e);
+}
+
+/** Queue of components that have been mounted and are awaiting componentDidMount */
+var mounts = [];
+
+/** Diff recursion count, used to track the end of the diff cycle. */
+var diffLevel = 0;
+
+/** Global flag indicating if the diff is currently within an SVG */
+var isSvgMode = false;
+
+/** Global flag indicating if the diff is performing hydration */
+var hydrating = false;
+
+/** Invoke queued componentDidMount lifecycle methods */
+function flushMounts() {
+ var c;
+ while (c = mounts.pop()) {
+ if (options.afterMount) options.afterMount(c);
+ if (c.componentDidMount) c.componentDidMount();
+ }
+}
+
+/** Apply differences in a given vnode (and it's deep children) to a real DOM Node.
+ * @param {Element} [dom=null] A DOM node to mutate into the shape of the `vnode`
+ * @param {VNode} vnode A VNode (with descendants forming a tree) representing the desired DOM structure
+ * @returns {Element} dom The created/mutated element
+ * @private
+ */
+function diff(dom, vnode, context, mountAll, parent, componentRoot) {
+ // diffLevel having been 0 here indicates initial entry into the diff (not a subdiff)
+ if (!diffLevel++) {
+ // when first starting the diff, check if we're diffing an SVG or within an SVG
+ isSvgMode = parent != null && parent.ownerSVGElement !== undefined;
+
+ // hydration is indicated by the existing element to be diffed not having a prop cache
+ hydrating = dom != null && !('__preactattr_' in dom);
+ }
+
+ var ret = idiff(dom, vnode, context, mountAll, componentRoot);
+
+ // append the element if its a new parent
+ if (parent && ret.parentNode !== parent) parent.appendChild(ret);
+
+ // diffLevel being reduced to 0 means we're exiting the diff
+ if (! --diffLevel) {
+ hydrating = false;
+ // invoke queued componentDidMount lifecycle methods
+ if (!componentRoot) flushMounts();
+ }
+
+ return ret;
+}
+
+/** Internals of `diff()`, separated to allow bypassing diffLevel / mount flushing. */
+function idiff(dom, vnode, context, mountAll, componentRoot) {
+ var out = dom,
+ prevSvgMode = isSvgMode;
+
+ // empty values (null, undefined, booleans) render as empty Text nodes
+ if (vnode == null || typeof vnode === 'boolean') vnode = '';
+
+ // Fast case: Strings & Numbers create/update Text nodes.
+ if (typeof vnode === 'string' || typeof vnode === 'number') {
+
+ // update if it's already a Text node:
+ if (dom && dom.splitText !== undefined && dom.parentNode && (!dom._component || componentRoot)) {
+ /* istanbul ignore if */ /* Browser quirk that can't be covered: https://github.com/developit/preact/commit/fd4f21f5c45dfd75151bd27b4c217d8003aa5eb9 */
+ if (dom.nodeValue != vnode) {
+ dom.nodeValue = vnode;
+ }
+ } else {
+ // it wasn't a Text node: replace it with one and recycle the old Element
+ out = document.createTextNode(vnode);
+ if (dom) {
+ if (dom.parentNode) dom.parentNode.replaceChild(out, dom);
+ recollectNodeTree(dom, true);
+ }
+ }
+
+ out['__preactattr_'] = true;
+
+ return out;
+ }
+
+ // If the VNode represents a Component, perform a component diff:
+ var vnodeName = vnode.nodeName;
+ if (typeof vnodeName === 'function') {
+ return buildComponentFromVNode(dom, vnode, context, mountAll);
+ }
+
+ // Tracks entering and exiting SVG namespace when descending through the tree.
+ isSvgMode = vnodeName === 'svg' ? true : vnodeName === 'foreignObject' ? false : isSvgMode;
+
+ // If there's no existing element or it's the wrong type, create a new one:
+ vnodeName = String(vnodeName);
+ if (!dom || !isNamedNode(dom, vnodeName)) {
+ out = createNode(vnodeName, isSvgMode);
+
+ if (dom) {
+ // move children into the replacement node
+ while (dom.firstChild) {
+ out.appendChild(dom.firstChild);
+ } // if the previous Element was mounted into the DOM, replace it inline
+ if (dom.parentNode) dom.parentNode.replaceChild(out, dom);
+
+ // recycle the old element (skips non-Element node types)
+ recollectNodeTree(dom, true);
+ }
+ }
+
+ var fc = out.firstChild,
+ props = out['__preactattr_'],
+ vchildren = vnode.children;
+
+ if (props == null) {
+ props = out['__preactattr_'] = {};
+ for (var a = out.attributes, i = a.length; i--;) {
+ props[a[i].name] = a[i].value;
+ }
+ }
+
+ // Optimization: fast-path for elements containing a single TextNode:
+ if (!hydrating && vchildren && vchildren.length === 1 && typeof vchildren[0] === 'string' && fc != null && fc.splitText !== undefined && fc.nextSibling == null) {
+ if (fc.nodeValue != vchildren[0]) {
+ fc.nodeValue = vchildren[0];
+ }
+ }
+ // otherwise, if there are existing or new children, diff them:
+ else if (vchildren && vchildren.length || fc != null) {
+ innerDiffNode(out, vchildren, context, mountAll, hydrating || props.dangerouslySetInnerHTML != null);
+ }
+
+ // Apply attributes/props from VNode to the DOM Element:
+ diffAttributes(out, vnode.attributes, props);
+
+ // restore previous SVG mode: (in case we're exiting an SVG namespace)
+ isSvgMode = prevSvgMode;
+
+ return out;
+}
+
+/** Apply child and attribute changes between a VNode and a DOM Node to the DOM.
+ * @param {Element} dom Element whose children should be compared & mutated
+ * @param {Array} vchildren Array of VNodes to compare to `dom.childNodes`
+ * @param {Object} context Implicitly descendant context object (from most recent `getChildContext()`)
+ * @param {Boolean} mountAll
+ * @param {Boolean} isHydrating If `true`, consumes externally created elements similar to hydration
+ */
+function innerDiffNode(dom, vchildren, context, mountAll, isHydrating) {
+ var originalChildren = dom.childNodes,
+ children = [],
+ keyed = {},
+ keyedLen = 0,
+ min = 0,
+ len = originalChildren.length,
+ childrenLen = 0,
+ vlen = vchildren ? vchildren.length : 0,
+ j,
+ c,
+ f,
+ vchild,
+ child;
+
+ // Build up a map of keyed children and an Array of unkeyed children:
+ if (len !== 0) {
+ for (var i = 0; i < len; i++) {
+ var _child = originalChildren[i],
+ props = _child['__preactattr_'],
+ key = vlen && props ? _child._component ? _child._component.__key : props.key : null;
+ if (key != null) {
+ keyedLen++;
+ keyed[key] = _child;
+ } else if (props || (_child.splitText !== undefined ? isHydrating ? _child.nodeValue.trim() : true : isHydrating)) {
+ children[childrenLen++] = _child;
+ }
+ }
+ }
+
+ if (vlen !== 0) {
+ for (var i = 0; i < vlen; i++) {
+ vchild = vchildren[i];
+ child = null;
+
+ // attempt to find a node based on key matching
+ var key = vchild.key;
+ if (key != null) {
+ if (keyedLen && keyed[key] !== undefined) {
+ child = keyed[key];
+ keyed[key] = undefined;
+ keyedLen--;
+ }
+ }
+ // attempt to pluck a node of the same type from the existing children
+ else if (!child && min < childrenLen) {
+ for (j = min; j < childrenLen; j++) {
+ if (children[j] !== undefined && isSameNodeType(c = children[j], vchild, isHydrating)) {
+ child = c;
+ children[j] = undefined;
+ if (j === childrenLen - 1) childrenLen--;
+ if (j === min) min++;
+ break;
+ }
+ }
+ }
+
+ // morph the matched/found/created DOM child to match vchild (deep)
+ child = idiff(child, vchild, context, mountAll);
+
+ f = originalChildren[i];
+ if (child && child !== dom && child !== f) {
+ if (f == null) {
+ dom.appendChild(child);
+ } else if (child === f.nextSibling) {
+ removeNode(f);
+ } else {
+ dom.insertBefore(child, f);
+ }
+ }
+ }
+ }
+
+ // remove unused keyed children:
+ if (keyedLen) {
+ for (var i in keyed) {
+ if (keyed[i] !== undefined) recollectNodeTree(keyed[i], false);
+ }
+ }
+
+ // remove orphaned unkeyed children:
+ while (min <= childrenLen) {
+ if ((child = children[childrenLen--]) !== undefined) recollectNodeTree(child, false);
+ }
+}
+
+/** Recursively recycle (or just unmount) a node and its descendants.
+ * @param {Node} node DOM node to start unmount/removal from
+ * @param {Boolean} [unmountOnly=false] If `true`, only triggers unmount lifecycle, skips removal
+ */
+function recollectNodeTree(node, unmountOnly) {
+ var component = node._component;
+ if (component) {
+ // if node is owned by a Component, unmount that component (ends up recursing back here)
+ unmountComponent(component);
+ } else {
+ // If the node's VNode had a ref function, invoke it with null here.
+ // (this is part of the React spec, and smart for unsetting references)
+ if (node['__preactattr_'] != null && node['__preactattr_'].ref) node['__preactattr_'].ref(null);
+
+ if (unmountOnly === false || node['__preactattr_'] == null) {
+ removeNode(node);
+ }
+
+ removeChildren(node);
+ }
+}
+
+/** Recollect/unmount all children.
+ * - we use .lastChild here because it causes less reflow than .firstChild
+ * - it's also cheaper than accessing the .childNodes Live NodeList
+ */
+function removeChildren(node) {
+ node = node.lastChild;
+ while (node) {
+ var next = node.previousSibling;
+ recollectNodeTree(node, true);
+ node = next;
+ }
+}
+
+/** Apply differences in attributes from a VNode to the given DOM Element.
+ * @param {Element} dom Element with attributes to diff `attrs` against
+ * @param {Object} attrs The desired end-state key-value attribute pairs
+ * @param {Object} old Current/previous attributes (from previous VNode or element's prop cache)
+ */
+function diffAttributes(dom, attrs, old) {
+ var name;
+
+ // remove attributes no longer present on the vnode by setting them to undefined
+ for (name in old) {
+ if (!(attrs && attrs[name] != null) && old[name] != null) {
+ setAccessor(dom, name, old[name], old[name] = undefined, isSvgMode);
+ }
+ }
+
+ // add new & update changed attributes
+ for (name in attrs) {
+ if (name !== 'children' && name !== 'innerHTML' && (!(name in old) || attrs[name] !== (name === 'value' || name === 'checked' ? dom[name] : old[name]))) {
+ setAccessor(dom, name, old[name], old[name] = attrs[name], isSvgMode);
+ }
+ }
+}
+
+/** Retains a pool of Components for re-use, keyed on component name.
+ * Note: since component names are not unique or even necessarily available, these are primarily a form of sharding.
+ * @private
+ */
+var components = {};
+
+/** Reclaim a component for later re-use by the recycler. */
+function collectComponent(component) {
+ var name = component.constructor.name;
+ (components[name] || (components[name] = [])).push(component);
+}
+
+/** Create a component. Normalizes differences between PFC's and classful Components. */
+function createComponent(Ctor, props, context) {
+ var list = components[Ctor.name],
+ inst;
+
+ if (Ctor.prototype && Ctor.prototype.render) {
+ inst = new Ctor(props, context);
+ Component.call(inst, props, context);
+ } else {
+ inst = new Component(props, context);
+ inst.constructor = Ctor;
+ inst.render = doRender;
+ }
+
+ if (list) {
+ for (var i = list.length; i--;) {
+ if (list[i].constructor === Ctor) {
+ inst.nextBase = list[i].nextBase;
+ list.splice(i, 1);
+ break;
+ }
+ }
+ }
+ return inst;
+}
+
+/** The `.render()` method for a PFC backing instance. */
+function doRender(props, state, context) {
+ return this.constructor(props, context);
+}
+
+/** Set a component's `props` (generally derived from JSX attributes).
+ * @param {Object} props
+ * @param {Object} [opts]
+ * @param {boolean} [opts.renderSync=false] If `true` and {@link options.syncComponentUpdates} is `true`, triggers synchronous rendering.
+ * @param {boolean} [opts.render=true] If `false`, no render will be triggered.
+ */
+function setComponentProps(component, props, opts, context, mountAll) {
+ if (component._disable) return;
+ component._disable = true;
+
+ if (component.__ref = props.ref) delete props.ref;
+ if (component.__key = props.key) delete props.key;
+
+ if (!component.base || mountAll) {
+ if (component.componentWillMount) component.componentWillMount();
+ } else if (component.componentWillReceiveProps) {
+ component.componentWillReceiveProps(props, context);
+ }
+
+ if (context && context !== component.context) {
+ if (!component.prevContext) component.prevContext = component.context;
+ component.context = context;
+ }
+
+ if (!component.prevProps) component.prevProps = component.props;
+ component.props = props;
+
+ component._disable = false;
+
+ if (opts !== 0) {
+ if (opts === 1 || options.syncComponentUpdates !== false || !component.base) {
+ renderComponent(component, 1, mountAll);
+ } else {
+ enqueueRender(component);
+ }
+ }
+
+ if (component.__ref) component.__ref(component);
+}
+
+/** Render a Component, triggering necessary lifecycle events and taking High-Order Components into account.
+ * @param {Component} component
+ * @param {Object} [opts]
+ * @param {boolean} [opts.build=false] If `true`, component will build and store a DOM node if not already associated with one.
+ * @private
+ */
+function renderComponent(component, opts, mountAll, isChild) {
+ if (component._disable) return;
+
+ var props = component.props,
+ state = component.state,
+ context = component.context,
+ previousProps = component.prevProps || props,
+ previousState = component.prevState || state,
+ previousContext = component.prevContext || context,
+ isUpdate = component.base,
+ nextBase = component.nextBase,
+ initialBase = isUpdate || nextBase,
+ initialChildComponent = component._component,
+ skip = false,
+ rendered,
+ inst,
+ cbase;
+
+ // if updating
+ if (isUpdate) {
+ component.props = previousProps;
+ component.state = previousState;
+ component.context = previousContext;
+ if (opts !== 2 && component.shouldComponentUpdate && component.shouldComponentUpdate(props, state, context) === false) {
+ skip = true;
+ } else if (component.componentWillUpdate) {
+ component.componentWillUpdate(props, state, context);
+ }
+ component.props = props;
+ component.state = state;
+ component.context = context;
+ }
+
+ component.prevProps = component.prevState = component.prevContext = component.nextBase = null;
+ component._dirty = false;
+
+ if (!skip) {
+ rendered = component.render(props, state, context);
+
+ // context to pass to the child, can be updated via (grand-)parent component
+ if (component.getChildContext) {
+ context = extend(extend({}, context), component.getChildContext());
+ }
+
+ var childComponent = rendered && rendered.nodeName,
+ toUnmount,
+ base;
+
+ if (typeof childComponent === 'function') {
+ // set up high order component link
+
+ var childProps = getNodeProps(rendered);
+ inst = initialChildComponent;
+
+ if (inst && inst.constructor === childComponent && childProps.key == inst.__key) {
+ setComponentProps(inst, childProps, 1, context, false);
+ } else {
+ toUnmount = inst;
+
+ component._component = inst = createComponent(childComponent, childProps, context);
+ inst.nextBase = inst.nextBase || nextBase;
+ inst._parentComponent = component;
+ setComponentProps(inst, childProps, 0, context, false);
+ renderComponent(inst, 1, mountAll, true);
+ }
+
+ base = inst.base;
+ } else {
+ cbase = initialBase;
+
+ // destroy high order component link
+ toUnmount = initialChildComponent;
+ if (toUnmount) {
+ cbase = component._component = null;
+ }
+
+ if (initialBase || opts === 1) {
+ if (cbase) cbase._component = null;
+ base = diff(cbase, rendered, context, mountAll || !isUpdate, initialBase && initialBase.parentNode, true);
+ }
+ }
+
+ if (initialBase && base !== initialBase && inst !== initialChildComponent) {
+ var baseParent = initialBase.parentNode;
+ if (baseParent && base !== baseParent) {
+ baseParent.replaceChild(base, initialBase);
+
+ if (!toUnmount) {
+ initialBase._component = null;
+ recollectNodeTree(initialBase, false);
+ }
+ }
+ }
+
+ if (toUnmount) {
+ unmountComponent(toUnmount);
+ }
+
+ component.base = base;
+ if (base && !isChild) {
+ var componentRef = component,
+ t = component;
+ while (t = t._parentComponent) {
+ (componentRef = t).base = base;
+ }
+ base._component = componentRef;
+ base._componentConstructor = componentRef.constructor;
+ }
+ }
+
+ if (!isUpdate || mountAll) {
+ mounts.unshift(component);
+ } else if (!skip) {
+ // Ensure that pending componentDidMount() hooks of child components
+ // are called before the componentDidUpdate() hook in the parent.
+ // Note: disabled as it causes duplicate hooks, see https://github.com/developit/preact/issues/750
+ // flushMounts();
+
+ if (component.componentDidUpdate) {
+ component.componentDidUpdate(previousProps, previousState, previousContext);
+ }
+ if (options.afterUpdate) options.afterUpdate(component);
+ }
+
+ if (component._renderCallbacks != null) {
+ while (component._renderCallbacks.length) {
+ component._renderCallbacks.pop().call(component);
+ }
+ }
+
+ if (!diffLevel && !isChild) flushMounts();
+}
+
+/** Apply the Component referenced by a VNode to the DOM.
+ * @param {Element} dom The DOM node to mutate
+ * @param {VNode} vnode A Component-referencing VNode
+ * @returns {Element} dom The created/mutated element
+ * @private
+ */
+function buildComponentFromVNode(dom, vnode, context, mountAll) {
+ var c = dom && dom._component,
+ originalComponent = c,
+ oldDom = dom,
+ isDirectOwner = c && dom._componentConstructor === vnode.nodeName,
+ isOwner = isDirectOwner,
+ props = getNodeProps(vnode);
+ while (c && !isOwner && (c = c._parentComponent)) {
+ isOwner = c.constructor === vnode.nodeName;
+ }
+
+ if (c && isOwner && (!mountAll || c._component)) {
+ setComponentProps(c, props, 3, context, mountAll);
+ dom = c.base;
+ } else {
+ if (originalComponent && !isDirectOwner) {
+ unmountComponent(originalComponent);
+ dom = oldDom = null;
+ }
+
+ c = createComponent(vnode.nodeName, props, context);
+ if (dom && !c.nextBase) {
+ c.nextBase = dom;
+ // passing dom/oldDom as nextBase will recycle it if unused, so bypass recycling on L229:
+ oldDom = null;
+ }
+ setComponentProps(c, props, 1, context, mountAll);
+ dom = c.base;
+
+ if (oldDom && dom !== oldDom) {
+ oldDom._component = null;
+ recollectNodeTree(oldDom, false);
+ }
+ }
+
+ return dom;
+}
+
+/** Remove a component from the DOM and recycle it.
+ * @param {Component} component The Component instance to unmount
+ * @private
+ */
+function unmountComponent(component) {
+ if (options.beforeUnmount) options.beforeUnmount(component);
+
+ var base = component.base;
+
+ component._disable = true;
+
+ if (component.componentWillUnmount) component.componentWillUnmount();
+
+ component.base = null;
+
+ // recursively tear down & recollect high-order component children:
+ var inner = component._component;
+ if (inner) {
+ unmountComponent(inner);
+ } else if (base) {
+ if (base['__preactattr_'] && base['__preactattr_'].ref) base['__preactattr_'].ref(null);
+
+ component.nextBase = base;
+
+ removeNode(base);
+ collectComponent(component);
+
+ removeChildren(base);
+ }
+
+ if (component.__ref) component.__ref(null);
+}
+
+/** Base Component class.
+ * Provides `setState()` and `forceUpdate()`, which trigger rendering.
+ * @public
+ *
+ * @example
+ * class MyFoo extends Component {
+ * render(props, state) {
+ * return ;
+ * }
+ * }
+ */
+function Component(props, context) {
+ this._dirty = true;
+
+ /** @public
+ * @type {object}
+ */
+ this.context = context;
+
+ /** @public
+ * @type {object}
+ */
+ this.props = props;
+
+ /** @public
+ * @type {object}
+ */
+ this.state = this.state || {};
+}
+
+extend(Component.prototype, {
+
+ /** Returns a `boolean` indicating if the component should re-render when receiving the given `props` and `state`.
+ * @param {object} nextProps
+ * @param {object} nextState
+ * @param {object} nextContext
+ * @returns {Boolean} should the component re-render
+ * @name shouldComponentUpdate
+ * @function
+ */
+
+ /** Update component state by copying properties from `state` to `this.state`.
+ * @param {object} state A hash of state properties to update with new values
+ * @param {function} callback A function to be called once component state is updated
+ */
+ setState: function setState(state, callback) {
+ var s = this.state;
+ if (!this.prevState) this.prevState = extend({}, s);
+ extend(s, typeof state === 'function' ? state(s, this.props) : state);
+ if (callback) (this._renderCallbacks = this._renderCallbacks || []).push(callback);
+ enqueueRender(this);
+ },
+
+
+ /** Immediately perform a synchronous re-render of the component.
+ * @param {function} callback A function to be called after component is re-rendered.
+ * @private
+ */
+ forceUpdate: function forceUpdate(callback) {
+ if (callback) (this._renderCallbacks = this._renderCallbacks || []).push(callback);
+ renderComponent(this, 2);
+ },
+
+
+ /** Accepts `props` and `state`, and returns a new Virtual DOM tree to build.
+ * Virtual DOM is generally constructed via [JSX](http://jasonformat.com/wtf-is-jsx).
+ * @param {object} props Props (eg: JSX attributes) received from parent element/component
+ * @param {object} state The component's current state
+ * @param {object} context Context object (if a parent component has provided context)
+ * @returns VNode
+ */
+ render: function render() {}
+});
+
+/** Render JSX into a `parent` Element.
+ * @param {VNode} vnode A (JSX) VNode to render
+ * @param {Element} parent DOM element to render into
+ * @param {Element} [merge] Attempt to re-use an existing DOM tree rooted at `merge`
+ * @public
+ *
+ * @example
+ * // render a div into :
+ * render(hello!
, document.body);
+ *
+ * @example
+ * // render a "Thing" component into #foo:
+ * const Thing = ({ name }) => { name };
+ * render(, document.querySelector('#foo'));
+ */
+function render(vnode, parent, merge) {
+ return diff(merge, vnode, {}, false, parent, false);
+}
+
+var preact = {
+ h: h,
+ createElement: h,
+ cloneElement: cloneElement,
+ Component: Component,
+ render: render,
+ rerender: rerender,
+ options: options
+};
+
+/* harmony default export */ __webpack_exports__["default"] = (preact);
+//# sourceMappingURL=preact.esm.js.map
+
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(6);
+__webpack_require__(7);
+module.exports = __webpack_require__(8);
+
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports) {
+
+// removed by extract-text-webpack-plugin
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports) {
+
+(function(self) {
+ 'use strict';
+
+ if (self.fetch) {
+ return
+ }
+
+ var support = {
+ searchParams: 'URLSearchParams' in self,
+ iterable: 'Symbol' in self && 'iterator' in Symbol,
+ blob: 'FileReader' in self && 'Blob' in self && (function() {
+ try {
+ new Blob()
+ return true
+ } catch(e) {
+ return false
+ }
+ })(),
+ formData: 'FormData' in self,
+ arrayBuffer: 'ArrayBuffer' in self
+ }
+
+ if (support.arrayBuffer) {
+ var viewClasses = [
+ '[object Int8Array]',
+ '[object Uint8Array]',
+ '[object Uint8ClampedArray]',
+ '[object Int16Array]',
+ '[object Uint16Array]',
+ '[object Int32Array]',
+ '[object Uint32Array]',
+ '[object Float32Array]',
+ '[object Float64Array]'
+ ]
+
+ var isDataView = function(obj) {
+ return obj && DataView.prototype.isPrototypeOf(obj)
+ }
+
+ var isArrayBufferView = ArrayBuffer.isView || function(obj) {
+ return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1
+ }
+ }
+
+ function normalizeName(name) {
+ if (typeof name !== 'string') {
+ name = String(name)
+ }
+ if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) {
+ throw new TypeError('Invalid character in header field name')
+ }
+ return name.toLowerCase()
+ }
+
+ function normalizeValue(value) {
+ if (typeof value !== 'string') {
+ value = String(value)
+ }
+ return value
+ }
+
+ // Build a destructive iterator for the value list
+ function iteratorFor(items) {
+ var iterator = {
+ next: function() {
+ var value = items.shift()
+ return {done: value === undefined, value: value}
+ }
+ }
+
+ if (support.iterable) {
+ iterator[Symbol.iterator] = function() {
+ return iterator
+ }
+ }
+
+ return iterator
+ }
+
+ function Headers(headers) {
+ this.map = {}
+
+ if (headers instanceof Headers) {
+ headers.forEach(function(value, name) {
+ this.append(name, value)
+ }, this)
+ } else if (Array.isArray(headers)) {
+ headers.forEach(function(header) {
+ this.append(header[0], header[1])
+ }, this)
+ } else if (headers) {
+ Object.getOwnPropertyNames(headers).forEach(function(name) {
+ this.append(name, headers[name])
+ }, this)
+ }
+ }
+
+ Headers.prototype.append = function(name, value) {
+ name = normalizeName(name)
+ value = normalizeValue(value)
+ var oldValue = this.map[name]
+ this.map[name] = oldValue ? oldValue+','+value : value
+ }
+
+ Headers.prototype['delete'] = function(name) {
+ delete this.map[normalizeName(name)]
+ }
+
+ Headers.prototype.get = function(name) {
+ name = normalizeName(name)
+ return this.has(name) ? this.map[name] : null
+ }
+
+ Headers.prototype.has = function(name) {
+ return this.map.hasOwnProperty(normalizeName(name))
+ }
+
+ Headers.prototype.set = function(name, value) {
+ this.map[normalizeName(name)] = normalizeValue(value)
+ }
+
+ Headers.prototype.forEach = function(callback, thisArg) {
+ for (var name in this.map) {
+ if (this.map.hasOwnProperty(name)) {
+ callback.call(thisArg, this.map[name], name, this)
+ }
+ }
+ }
+
+ Headers.prototype.keys = function() {
+ var items = []
+ this.forEach(function(value, name) { items.push(name) })
+ return iteratorFor(items)
+ }
+
+ Headers.prototype.values = function() {
+ var items = []
+ this.forEach(function(value) { items.push(value) })
+ return iteratorFor(items)
+ }
+
+ Headers.prototype.entries = function() {
+ var items = []
+ this.forEach(function(value, name) { items.push([name, value]) })
+ return iteratorFor(items)
+ }
+
+ if (support.iterable) {
+ Headers.prototype[Symbol.iterator] = Headers.prototype.entries
+ }
+
+ function consumed(body) {
+ if (body.bodyUsed) {
+ return Promise.reject(new TypeError('Already read'))
+ }
+ body.bodyUsed = true
+ }
+
+ function fileReaderReady(reader) {
+ return new Promise(function(resolve, reject) {
+ reader.onload = function() {
+ resolve(reader.result)
+ }
+ reader.onerror = function() {
+ reject(reader.error)
+ }
+ })
+ }
+
+ function readBlobAsArrayBuffer(blob) {
+ var reader = new FileReader()
+ var promise = fileReaderReady(reader)
+ reader.readAsArrayBuffer(blob)
+ return promise
+ }
+
+ function readBlobAsText(blob) {
+ var reader = new FileReader()
+ var promise = fileReaderReady(reader)
+ reader.readAsText(blob)
+ return promise
+ }
+
+ function readArrayBufferAsText(buf) {
+ var view = new Uint8Array(buf)
+ var chars = new Array(view.length)
+
+ for (var i = 0; i < view.length; i++) {
+ chars[i] = String.fromCharCode(view[i])
+ }
+ return chars.join('')
+ }
+
+ function bufferClone(buf) {
+ if (buf.slice) {
+ return buf.slice(0)
+ } else {
+ var view = new Uint8Array(buf.byteLength)
+ view.set(new Uint8Array(buf))
+ return view.buffer
+ }
+ }
+
+ function Body() {
+ this.bodyUsed = false
+
+ this._initBody = function(body) {
+ this._bodyInit = body
+ if (!body) {
+ this._bodyText = ''
+ } else if (typeof body === 'string') {
+ this._bodyText = body
+ } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
+ this._bodyBlob = body
+ } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
+ this._bodyFormData = body
+ } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
+ this._bodyText = body.toString()
+ } else if (support.arrayBuffer && support.blob && isDataView(body)) {
+ this._bodyArrayBuffer = bufferClone(body.buffer)
+ // IE 10-11 can't handle a DataView body.
+ this._bodyInit = new Blob([this._bodyArrayBuffer])
+ } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {
+ this._bodyArrayBuffer = bufferClone(body)
+ } else {
+ throw new Error('unsupported BodyInit type')
+ }
+
+ if (!this.headers.get('content-type')) {
+ if (typeof body === 'string') {
+ this.headers.set('content-type', 'text/plain;charset=UTF-8')
+ } else if (this._bodyBlob && this._bodyBlob.type) {
+ this.headers.set('content-type', this._bodyBlob.type)
+ } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
+ this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')
+ }
+ }
+ }
+
+ if (support.blob) {
+ this.blob = function() {
+ var rejected = consumed(this)
+ if (rejected) {
+ return rejected
+ }
+
+ if (this._bodyBlob) {
+ return Promise.resolve(this._bodyBlob)
+ } else if (this._bodyArrayBuffer) {
+ return Promise.resolve(new Blob([this._bodyArrayBuffer]))
+ } else if (this._bodyFormData) {
+ throw new Error('could not read FormData body as blob')
+ } else {
+ return Promise.resolve(new Blob([this._bodyText]))
+ }
+ }
+
+ this.arrayBuffer = function() {
+ if (this._bodyArrayBuffer) {
+ return consumed(this) || Promise.resolve(this._bodyArrayBuffer)
+ } else {
+ return this.blob().then(readBlobAsArrayBuffer)
+ }
+ }
+ }
+
+ this.text = function() {
+ var rejected = consumed(this)
+ if (rejected) {
+ return rejected
+ }
+
+ if (this._bodyBlob) {
+ return readBlobAsText(this._bodyBlob)
+ } else if (this._bodyArrayBuffer) {
+ return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))
+ } else if (this._bodyFormData) {
+ throw new Error('could not read FormData body as text')
+ } else {
+ return Promise.resolve(this._bodyText)
+ }
+ }
+
+ if (support.formData) {
+ this.formData = function() {
+ return this.text().then(decode)
+ }
+ }
+
+ this.json = function() {
+ return this.text().then(JSON.parse)
+ }
+
+ return this
+ }
+
+ // HTTP methods whose capitalization should be normalized
+ var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']
+
+ function normalizeMethod(method) {
+ var upcased = method.toUpperCase()
+ return (methods.indexOf(upcased) > -1) ? upcased : method
+ }
+
+ function Request(input, options) {
+ options = options || {}
+ var body = options.body
+
+ if (input instanceof Request) {
+ if (input.bodyUsed) {
+ throw new TypeError('Already read')
+ }
+ this.url = input.url
+ this.credentials = input.credentials
+ if (!options.headers) {
+ this.headers = new Headers(input.headers)
+ }
+ this.method = input.method
+ this.mode = input.mode
+ if (!body && input._bodyInit != null) {
+ body = input._bodyInit
+ input.bodyUsed = true
+ }
+ } else {
+ this.url = String(input)
+ }
+
+ this.credentials = options.credentials || this.credentials || 'omit'
+ if (options.headers || !this.headers) {
+ this.headers = new Headers(options.headers)
+ }
+ this.method = normalizeMethod(options.method || this.method || 'GET')
+ this.mode = options.mode || this.mode || null
+ this.referrer = null
+
+ if ((this.method === 'GET' || this.method === 'HEAD') && body) {
+ throw new TypeError('Body not allowed for GET or HEAD requests')
+ }
+ this._initBody(body)
+ }
+
+ Request.prototype.clone = function() {
+ return new Request(this, { body: this._bodyInit })
+ }
+
+ function decode(body) {
+ var form = new FormData()
+ body.trim().split('&').forEach(function(bytes) {
+ if (bytes) {
+ var split = bytes.split('=')
+ var name = split.shift().replace(/\+/g, ' ')
+ var value = split.join('=').replace(/\+/g, ' ')
+ form.append(decodeURIComponent(name), decodeURIComponent(value))
+ }
+ })
+ return form
+ }
+
+ function parseHeaders(rawHeaders) {
+ var headers = new Headers()
+ rawHeaders.split(/\r?\n/).forEach(function(line) {
+ var parts = line.split(':')
+ var key = parts.shift().trim()
+ if (key) {
+ var value = parts.join(':').trim()
+ headers.append(key, value)
+ }
+ })
+ return headers
+ }
+
+ Body.call(Request.prototype)
+
+ function Response(bodyInit, options) {
+ if (!options) {
+ options = {}
+ }
+
+ this.type = 'default'
+ this.status = 'status' in options ? options.status : 200
+ this.ok = this.status >= 200 && this.status < 300
+ this.statusText = 'statusText' in options ? options.statusText : 'OK'
+ this.headers = new Headers(options.headers)
+ this.url = options.url || ''
+ this._initBody(bodyInit)
+ }
+
+ Body.call(Response.prototype)
+
+ Response.prototype.clone = function() {
+ return new Response(this._bodyInit, {
+ status: this.status,
+ statusText: this.statusText,
+ headers: new Headers(this.headers),
+ url: this.url
+ })
+ }
+
+ Response.error = function() {
+ var response = new Response(null, {status: 0, statusText: ''})
+ response.type = 'error'
+ return response
+ }
+
+ var redirectStatuses = [301, 302, 303, 307, 308]
+
+ Response.redirect = function(url, status) {
+ if (redirectStatuses.indexOf(status) === -1) {
+ throw new RangeError('Invalid status code')
+ }
+
+ return new Response(null, {status: status, headers: {location: url}})
+ }
+
+ self.Headers = Headers
+ self.Request = Request
+ self.Response = Response
+
+ self.fetch = function(input, init) {
+ return new Promise(function(resolve, reject) {
+ var request = new Request(input, init)
+ var xhr = new XMLHttpRequest()
+
+ xhr.onload = function() {
+ var options = {
+ status: xhr.status,
+ statusText: xhr.statusText,
+ headers: parseHeaders(xhr.getAllResponseHeaders() || '')
+ }
+ options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')
+ var body = 'response' in xhr ? xhr.response : xhr.responseText
+ resolve(new Response(body, options))
+ }
+
+ xhr.onerror = function() {
+ reject(new TypeError('Network request failed'))
+ }
+
+ xhr.ontimeout = function() {
+ reject(new TypeError('Network request failed'))
+ }
+
+ xhr.open(request.method, request.url, true)
+
+ if (request.credentials === 'include') {
+ xhr.withCredentials = true
+ }
+
+ if ('responseType' in xhr && support.blob) {
+ xhr.responseType = 'blob'
+ }
+
+ request.headers.forEach(function(value, name) {
+ xhr.setRequestHeader(name, value)
+ })
+
+ xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)
+ })
+ }
+ self.fetch.polyfill = true
+})(typeof self !== 'undefined' ? self : this);
+
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+/**
+ * @author Timur Kuzhagaliyev
+ * @copyright 2017
+ * @license GPL-3.0
+ */
+
+var Akko = __webpack_require__(9);
+var Visualiser = __webpack_require__(1);
+var Visualisers = __webpack_require__(3);
+
+module.exports = Akko;
+module.exports.Visualiser = Visualiser;
+module.exports.visualisers = Visualisers;
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+/**
+ * @author Timur Kuzhagaliyev
+ * @copyright 2017
+ * @license GPL-3.0
+ */
+
+var THREE = __webpack_require__(0);
+
+var MusicPlayer = __webpack_require__(2);
+var VisualisationCore = __webpack_require__(12);
+var UI = __webpack_require__(17);
+
+/**
+ * @type {{containerId: string, useDefaultVisualisers: boolean, autoPlay: boolean}}
+ */
+var defaultOptions = {
+ containerId: 'akko',
+ useDefaultVisualisers: true,
+ autoPlay: false
+};
+
+/**
+ * @return {{containerId: string, useDefaultVisualisers: boolean, autoPlay: boolean}}
+ */
+var mergeOptions = function mergeOptions() {
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ var result = {};
+ for (var key in defaultOptions) {
+ if (!defaultOptions.hasOwnProperty(key)) continue;
+ result[key] = options[key] !== undefined ? options[key] : defaultOptions[key];
+ }
+ return result;
+};
+
+var Akko = function () {
+ function Akko(options) {
+ _classCallCheck(this, Akko);
+
+ if (!THREE) throw new Error('Akko could not find three.js (`THREE`)!');
+ if (!window) throw new Error('Akko could not find `window` variable! Are you running Akko in browser?');
+ if (!document) throw new Error('Akko could not find `document` variable! Are you running Akko in browser?');
+
+ this.AudioContext = window.AudioContext || window.webkitAudioContext;
+ if (!this.AudioContext) throw new Error('Akko could not find `AudioContext`! Is it supported in your browser?');
+
+ this.options = mergeOptions(options);
+
+ this.container = document.getElementById(this.options.containerId);
+ if (!this.container) throw new Error('Could not find element with ID \'' + this.options.containerId + '\'!');
+
+ this.musicPlayer = new MusicPlayer({
+ audioContext: new this.AudioContext(),
+ autoPlay: options.autoPlay
+ });
+ this.visCore = new VisualisationCore({
+ parentElement: this.container,
+ useDefaultVisualisers: this.options.useDefaultVisualisers,
+ analyser: this.musicPlayer.getAnalyser()
+ });
+ }
+
+ _createClass(Akko, [{
+ key: 'start',
+ value: function start() {
+ this.bootstrapUI();
+ this.visCore.prepare();
+ this.visCore.useVisualiser(0);
+ this.musicPlayer.start();
+ this.visCore.start();
+ this.setupListeners();
+ }
+ }, {
+ key: 'bootstrapUI',
+ value: function bootstrapUI() {
+ this.ui = new UI({
+ container: this.container,
+ musicPlayer: this.musicPlayer,
+ visCore: this.visCore
+ });
+ this.ui.start();
+ }
+
+ /**
+ * @param {Visualiser} visualiser
+ */
+
+ }, {
+ key: 'addVisualiser',
+ value: function addVisualiser(visualiser) {
+ this.visCore.addVisualiser(visualiser);
+ }
+
+ /**
+ * @param {string|File|ArrayBuffer} source
+ * @param {string} [title]
+ */
+
+ }, {
+ key: 'addTrack',
+ value: function addTrack(source, title) {
+ this.musicPlayer.addTrack(source, title);
+ }
+
+ /**
+ * @private
+ */
+
+ }, {
+ key: 'setupListeners',
+ value: function setupListeners() {
+ if (window.File && window.FileReader && window.FileList && window.Blob) {
+ this.container.addEventListener('dragover', this.onDragOver.bind(this), false);
+ this.container.addEventListener('drop', this.onDrop.bind(this), false);
+ } else {
+ console.warn('The File APIs are not fully supported your browser. Drag & drop disabled in Akko.');
+ }
+ }
+
+ /**
+ * @private
+ */
+
+ }, {
+ key: 'onDragOver',
+ value: function onDragOver(event) {
+ event.stopPropagation();
+ event.preventDefault();
+ event.dataTransfer.dropEffect = 'copy';
+ }
+
+ /**
+ * @private
+ */
+
+ }, {
+ key: 'onDrop',
+ value: function onDrop(event) {
+ event.stopPropagation();
+ event.preventDefault();
+ var files = event.dataTransfer.files;
+
+ for (var i = 0; i < files.length; i++) {
+ var file = files[i];
+ if (file.type.match(/audio.*/)) {
+ this.musicPlayer.addTrack(file);
+ }
+ }
+ }
+ }]);
+
+ return Akko;
+}();
+
+module.exports = Akko;
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports) {
+
+module.exports = Promise;
+
+/***/ }),
+/* 11 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+/**
+ * @author Timur Kuzhagaliyev
+ * @copyright 2017
+ * @license GPL-3.0
+ */
+
+var SourceTypes = {
+ URL: 'url',
+ FILE: 'file',
+ ARRAY_BUFFER: 'arrayBuffer'
+};
+
+var Track = function () {
+
+ /**
+ * @param {object} data
+ * @param {string|File} data.source
+ * @param {string} [data.title]
+ */
+ function Track(data) {
+ _classCallCheck(this, Track);
+
+ this.source = data.source;
+ this.title = data.title;
+ this.arrayBufferCache = null;
+ this.analyseSource();
+ }
+
+ _createClass(Track, [{
+ key: 'analyseSource',
+ value: function analyseSource() {
+ if (typeof this.source === 'string') {
+ this.sourceType = SourceTypes.URL;
+ this.title = this.title || decodeURIComponent(this.source.split('/').pop().replace(/\.[a-zA-Z0-9]+$/, ''));
+ } else if (this.source instanceof File) {
+ this.sourceType = SourceTypes.FILE;
+ this.title = this.title || this.source.name.replace(/\.[a-zA-Z0-9]+$/, '');
+ } else if (this.source instanceof ArrayBuffer) {
+ this.sourceType = SourceTypes.ARRAY_BUFFER;
+ this.title = this.title || 'Untitled';
+ } else {
+ throw new Error('\'Unsupported Track source type: ' + this.source);
+ }
+ }
+
+ /**
+ * @return {Promise.}
+ */
+
+ }, {
+ key: 'prepareArrayBuffer',
+ value: function prepareArrayBuffer() {
+ var _this = this;
+
+ if (this.arrayBufferCache) return Promise.resolve(this.arrayBufferCache);
+ switch (this.sourceType) {
+ case SourceTypes.URL:
+ return window.fetch(this.source).then(function (response) {
+ if (!response.ok) {
+ throw new Error('HTTP ' + response.status + ': ' + response.statusText);
+ }
+ return response.arrayBuffer();
+ }).then(function (arrayBuffer) {
+ // Clone the buffer to prevent detachment issues
+ var clonedBuffer = arrayBuffer.slice(0);
+ _this.arrayBufferCache = clonedBuffer;
+ return clonedBuffer;
+ });
+ case SourceTypes.FILE:
+ return new Promise(function (resolve, reject) {
+ var reader = new window.FileReader();
+ reader.onload = function (fileEvent) {
+ var arrayBuffer = fileEvent.target.result;
+ _this.arrayBufferCache = arrayBuffer;
+ resolve(arrayBuffer);
+ };
+ reader.onerror = function (error) {
+ reject(error);
+ };
+ reader.readAsArrayBuffer(_this.source);
+ });
+ case SourceTypes.ARRAY_BUFFER:
+ return Promise.resolve(this.source);
+ default:
+ return Promise.reject(new Error('\'Unsupported track source type: ' + this.sourceType));
+ }
+ }
+ }]);
+
+ return Track;
+}();
+
+module.exports = Track;
+module.exports.SourceTypes = SourceTypes;
+
+/***/ }),
+/* 12 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+/**
+ * @author Timur Kuzhagaliyev
+ * @copyright 2017
+ * @license GPL-3.0
+ */
+
+var THREE = __webpack_require__(0);
+var elementResizeEvent = __webpack_require__(13);
+
+var Visualisers = __webpack_require__(3);
+
+var VisualisationCore = function () {
+
+ /**
+ * @param {object} data
+ * @param {Element} data.parentElement
+ * @param {boolean} data.useDefaultVisualisers
+ * @param {object} data.analyser
+ */
+ function VisualisationCore(data) {
+ _classCallCheck(this, VisualisationCore);
+
+ this.parentElement = data.parentElement;
+
+ this.frequencyDataArray = null;
+ this.analyser = data.analyser;
+
+ /**
+ * @callback visualiserListener
+ * @param {Track[]} visualisers
+ * @param {int} currentVisualiserIndex
+ */
+ /** @type {visualiserListener[]} */
+ this.listeners = [];
+
+ this.visualisers = data.useDefaultVisualisers ? this.prepareDefaultVisualisers() : [];
+ this.currentVisualiserIndex = -1;
+ }
+
+ _createClass(VisualisationCore, [{
+ key: 'prepareDefaultVisualisers',
+ value: function prepareDefaultVisualisers() {
+ var visualisers = [];
+ for (var key in Visualisers) {
+ if (!Visualisers.hasOwnProperty(key)) continue;
+ var visualiserClass = Visualisers[key];
+ visualisers.push(new visualiserClass());
+ }
+ return visualisers;
+ }
+ }, {
+ key: 'notifyListeners',
+ value: function notifyListeners() {
+ for (var i = 0; i < this.listeners.length; i++) {
+ var listener = this.listeners[i];
+ listener(this.visualisers, this.currentVisualiserIndex);
+ }
+ }
+
+ /**
+ * @param {visualiserListener} listener
+ */
+
+ }, {
+ key: 'addListener',
+ value: function addListener(listener) {
+ this.listeners.push(listener);
+ this.notifyListeners();
+ }
+
+ /**
+ * @param {Visualiser} visualiser
+ */
+
+ }, {
+ key: 'addVisualiser',
+ value: function addVisualiser(visualiser) {
+ this.visualisers.push(visualiser);
+ this.notifyListeners();
+ }
+ }, {
+ key: 'prepare',
+ value: function prepare() {
+ var width = this.parentElement.offsetWidth;
+ var height = this.parentElement.offsetHeight;
+
+ this.renderer = new THREE.WebGLRenderer();
+ this.renderer.setSize(width, height);
+ this.canvas = this.renderer.domElement;
+ this.parentElement.appendChild(this.canvas);
+ }
+ }, {
+ key: 'start',
+ value: function start() {
+ this.setupListeners();
+ this.renderLoop();
+ this.notifyListeners();
+ }
+
+ /**
+ * @param {int} index
+ */
+
+ }, {
+ key: 'useVisualiser',
+ value: function useVisualiser(index) {
+ var visualiser = this.visualisers[index];
+ if (visualiser) this.prepareVisualiser(visualiser);
+ if (this.visualiser) this.visualiser.pause();
+ this.currentVisualiserIndex = index;
+ this.visualiser = visualiser;
+ this.notifyListeners();
+ }
+
+ /**
+ * @param {Visualiser} visualiser
+ */
+
+ }, {
+ key: 'prepareVisualiser',
+ value: function prepareVisualiser(visualiser) {
+ this.analyser.fftSize = visualiser.fftSize;
+ this.analyser.smoothingTimeConstant = visualiser.smoothingTimeConstant;
+ this.frequencyDataArray = new Float32Array(this.analyser.frequencyBinCount);
+ this.timeDomainDataArray = new Float32Array(this.analyser.frequencyBinCount);
+ var data = {
+ renderer: this.renderer,
+ analyser: this.analyser,
+ width: this.canvas.clientWidth,
+ height: this.canvas.clientHeight
+ };
+ if (!visualiser.isInitialised()) visualiser.init(data);else if (visualiser.isPaused()) visualiser.revive(data);
+ visualiser.resize(data);
+ }
+ }, {
+ key: 'setupListeners',
+ value: function setupListeners() {
+ elementResizeEvent(this.parentElement, this.onParentResize.bind(this));
+ }
+ }, {
+ key: 'renderLoop',
+ value: function renderLoop() {
+ var _this = this;
+
+ if (this.visualiser) {
+ if (this.analyser) {
+ this.analyser.getFloatFrequencyData(this.frequencyDataArray);
+ this.analyser.getFloatTimeDomainData(this.timeDomainDataArray);
+ }
+ this.visualiser.update({
+ renderer: this.renderer,
+ analyser: this.analyser,
+ frequencyData: this.frequencyDataArray,
+ timeDomainData: this.timeDomainDataArray
+ });
+ } else {
+ // TODO: Display warning about no visualiser
+ }
+ setTimeout(function () {
+ requestAnimationFrame(_this.renderLoop.bind(_this));
+ }, 1000 / 30);
+ }
+ }, {
+ key: 'onParentResize',
+ value: function onParentResize() {
+ var width = this.parentElement.offsetWidth;
+ var height = this.parentElement.offsetHeight;
+ this.renderer.setSize(width, height);
+ if (this.visualiser) this.visualiser.resize({
+ renderer: this.renderer,
+ width: width,
+ height: height
+ });
+ }
+ }]);
+
+ return VisualisationCore;
+}();
+
+module.exports = VisualisationCore;
+
+/***/ }),
+/* 13 */
+/***/ (function(module, exports) {
+
+var requestFrame = (function () {
+ var window = this
+ var raf = window.requestAnimationFrame ||
+ window.mozRequestAnimationFrame ||
+ window.webkitRequestAnimationFrame ||
+ function fallbackRAF(func) {
+ return window.setTimeout(func, 20)
+ }
+ return function requestFrameFunction(func) {
+ return raf(func)
+ }
+})()
+
+var cancelFrame = (function () {
+ var window = this
+ var cancel = window.cancelAnimationFrame ||
+ window.mozCancelAnimationFrame ||
+ window.webkitCancelAnimationFrame ||
+ window.clearTimeout
+ return function cancelFrameFunction(id) {
+ return cancel(id)
+ }
+})()
+
+function resizeListener(e) {
+ var win = e.target || e.srcElement
+ if (win.__resizeRAF__) {
+ cancelFrame(win.__resizeRAF__)
+ }
+ win.__resizeRAF__ = requestFrame(function () {
+ var trigger = win.__resizeTrigger__
+ trigger.__resizeListeners__.forEach(function (fn) {
+ fn.call(trigger, e)
+ })
+ })
+}
+
+var exports = function exports(element, fn) {
+ var window = this
+ var document = window.document
+ var isIE
+
+ var attachEvent = document.attachEvent
+ if (typeof navigator !== 'undefined') {
+ isIE = navigator.userAgent.match(/Trident/) ||
+ navigator.userAgent.match(/Edge/)
+ }
+
+ function objectLoad() {
+ this.contentDocument.defaultView.__resizeTrigger__ = this.__resizeElement__
+ this.contentDocument.defaultView.addEventListener('resize', resizeListener)
+ }
+
+ if (!element.__resizeListeners__) {
+ element.__resizeListeners__ = []
+ if (attachEvent) {
+ element.__resizeTrigger__ = element
+ element.attachEvent('onresize', resizeListener)
+ } else {
+ if (getComputedStyle(element).position === 'static') {
+ element.style.position = 'relative'
+ }
+ var obj = (element.__resizeTrigger__ = document.createElement('object'))
+ obj.setAttribute(
+ 'style',
+ 'display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden; pointer-events: none; z-index: -1; opacity: 0;'
+ )
+ obj.setAttribute('class', 'resize-sensor')
+ obj.__resizeElement__ = element
+ obj.onload = objectLoad
+ obj.type = 'text/html'
+ if (isIE) {
+ element.appendChild(obj)
+ }
+ obj.data = 'about:blank'
+ if (!isIE) {
+ element.appendChild(obj)
+ }
+ }
+ }
+ element.__resizeListeners__.push(fn)
+}
+
+module.exports = typeof window === 'undefined' ? exports : exports.bind(window)
+
+module.exports.unbind = function (element, fn) {
+ var attachEvent = document.attachEvent
+ if (fn) {
+ element.__resizeListeners__.splice(
+ element.__resizeListeners__.indexOf(fn),
+ 1
+ )
+ } else {
+ element.__resizeListeners__ = []
+ }
+ if (!element.__resizeListeners__.length) {
+ if (attachEvent) {
+ element.detachEvent('onresize', resizeListener)
+ } else {
+ element.__resizeTrigger__.contentDocument.defaultView.removeEventListener(
+ 'resize',
+ resizeListener
+ )
+ delete element.__resizeTrigger__.contentDocument.defaultView.__resizeTrigger__
+ element.__resizeTrigger__ = !element.removeChild(
+ element.__resizeTrigger__
+ )
+ }
+ delete element.__resizeListeners__
+ }
+}
+
+
+/***/ }),
+/* 14 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * @author Timur Kuzhagaliyev
+ * @copyright 2017
+ * @license GPL-3.0
+ */
+
+var THREE = __webpack_require__(0);
+var Visualiser = __webpack_require__(1);
+
+var BAR_COUNT = 32;
+
+var BarVisualiser = function (_Visualiser) {
+ _inherits(BarVisualiser, _Visualiser);
+
+ function BarVisualiser() {
+ _classCallCheck(this, BarVisualiser);
+
+ return _possibleConstructorReturn(this, (BarVisualiser.__proto__ || Object.getPrototypeOf(BarVisualiser)).call(this, {
+ code: 'Ba',
+ name: 'Bars 3D',
+ fftSize: BAR_COUNT * 2,
+ smoothingTimeConstant: 0.9
+ }));
+ }
+
+ _createClass(BarVisualiser, [{
+ key: 'onInit',
+ value: function onInit(data) {
+ this.setupSceneAndCamera(data);
+ this.setupLights(data);
+ this.setupPlane(data);
+ this.setupBars(data);
+ }
+ }, {
+ key: 'setupSceneAndCamera',
+ value: function setupSceneAndCamera(data) {
+ this.scene = new THREE.Scene();
+ this.camera = new THREE.PerspectiveCamera(60, data.width / data.height, 0.1, 100);
+ this.camera.position.set(0, 15, 17);
+ this.camera.rotation.x = -Math.PI / 4;
+ this.cameraPivot = new THREE.Object3D();
+ this.cameraPivot.add(this.camera);
+ this.cameraPivot.castShadow = true;
+ this.scene.add(this.cameraPivot);
+ }
+ }, {
+ key: 'setupLights',
+ value: function setupLights() {
+ var ambientLight = new THREE.AmbientLight(0x404040, 0.8);
+ this.scene.add(ambientLight);
+ }
+ }, {
+ key: 'setupPlane',
+ value: function setupPlane() {
+ var planeGeometry = new THREE.PlaneGeometry(200, 200, 1);
+ var planeMaterial = new THREE.MeshPhongMaterial({ color: 0x444444, side: THREE.DoubleSide });
+ var plane = new THREE.Mesh(planeGeometry, planeMaterial);
+ plane.receiveShadow = true;
+ plane.rotation.x = Math.PI / 2;
+ this.scene.add(plane);
+ }
+ }, {
+ key: 'setupBars',
+ value: function setupBars() {
+ this.bars = [];
+ this.lights = [];
+ this.cubeLights = [];
+ var step = 2 * Math.PI / BAR_COUNT;
+ var geometry = new THREE.BoxGeometry(0.5, 10, 0.5);
+ var radius = 5;
+ for (var i = 0; i < BAR_COUNT; i++) {
+ var color = 0xff0000 + i * 5;
+ var bar = new THREE.Object3D();
+ var material = new THREE.MeshLambertMaterial({ color: color });
+ var cube = new THREE.Mesh(geometry, material);
+ var cubeLight = new THREE.PointLight(color, 0, 4);
+ cubeLight.position.y = 7;
+ cubeLight.position.x = -1;
+ cube.add(cubeLight);
+ var light = new THREE.PointLight(color, 0, 10);
+ light.position.y = 1;
+ light.position.x = 10;
+ bar.add(light);
+ bar.add(cube);
+ bar.position.x = radius;
+ cube.position.y = -4.8;
+ var pivot = new THREE.Object3D();
+ pivot.rotation.y = step * i;
+ pivot.add(bar);
+ this.scene.add(pivot);
+ this.bars.push(cube);
+ this.lights.push(light);
+ this.cubeLights.push(cubeLight);
+ }
+ }
+ }, {
+ key: 'onUpdate',
+ value: function onUpdate(data) {
+ for (var i = 0; i < BAR_COUNT; i++) {
+ var bar = this.bars[i];
+ var light = this.lights[i];
+ var cubeLight = this.cubeLights[i];
+ var frequency = Math.abs(data.frequencyData[i]);
+ var timeDomain = data.timeDomainData[i];
+
+ var value = frequency * timeDomain;
+ if (value === Infinity || value === -Infinity) continue;
+ var newY = bar.position.y + (value - bar.position.y) / 30;
+ if (isNaN(newY)) continue;
+
+ light.intensity = Math.max(0, newY);
+ cubeLight.intensity = Math.max(0, newY) * 0.5;
+ bar.position.y = newY;
+ }
+ this.cameraPivot.rotation.y += 0.01;
+ data.renderer.render(this.scene, this.camera);
+ }
+ }, {
+ key: 'onResize',
+ value: function onResize(data) {
+ this.camera.aspect = data.width / data.height;
+ this.camera.updateProjectionMatrix();
+ }
+ }, {
+ key: 'onDestroy',
+ value: function onDestroy() {
+ delete this.scene;
+ delete this.camera;
+ }
+ }]);
+
+ return BarVisualiser;
+}(Visualiser);
+
+module.exports = BarVisualiser;
+
+/***/ }),
+/* 15 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+/**
+ * @author Timur Kuzhagaliyev
+ * @copyright 2017
+ * @license GPL-3.0
+ */
+
+var Helper = function () {
+ function Helper() {
+ _classCallCheck(this, Helper);
+ }
+
+ _createClass(Helper, [{
+ key: "lerp",
+ value: function lerp(current, target, fraction) {
+ if (isNaN(target) || target === Infinity || target === -Infinity) return current;
+ return current + (target - current) * fraction;
+ }
+ }, {
+ key: "constrain",
+ value: function constrain(max, min, value) {
+ return Math.min(max, Math.max(min, value));
+ }
+ }]);
+
+ return Helper;
+}();
+
+module.exports = Helper;
+
+/***/ }),
+/* 16 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * @author Timur Kuzhagaliyev
+ * @copyright 2017
+ * @license GPL-3.0
+ */
+
+var THREE = __webpack_require__(0);
+var Visualiser = __webpack_require__(1);
+
+var RING_COUNT = 16;
+
+var RingVisualiser = function (_Visualiser) {
+ _inherits(RingVisualiser, _Visualiser);
+
+ function RingVisualiser() {
+ _classCallCheck(this, RingVisualiser);
+
+ return _possibleConstructorReturn(this, (RingVisualiser.__proto__ || Object.getPrototypeOf(RingVisualiser)).call(this, {
+ code: 'Rn',
+ name: 'Rings 2D',
+ fftSize: RING_COUNT * 2,
+ smoothingTimeConstant: 0.9
+ }));
+ }
+
+ _createClass(RingVisualiser, [{
+ key: 'onInit',
+ value: function onInit(data) {
+ this.setupSceneAndCamera(data);
+ this.setupRings();
+ }
+ }, {
+ key: 'setupSceneAndCamera',
+ value: function setupSceneAndCamera(data) {
+ this.scene = new THREE.Scene();
+
+ this.camera = new THREE.PerspectiveCamera(60, data.width / data.height, 0.1, 100);
+ this.camera.position.z = 20;
+ this.camera.lookAt(new THREE.Vector3(0, 0, 0));
+ this.scene.add(this.camera);
+ }
+ }, {
+ key: 'setupRings',
+ value: function setupRings() {
+ this.rings = [];
+ var hslStep = 1 / RING_COUNT;
+ for (var i = 0; i < RING_COUNT; i++) {
+ var radius = 2 + i;
+ var segments = 64;
+ var material = new THREE.LineBasicMaterial({ color: 0x0000ff * i });
+ material.color.setHSL(hslStep * i, 1, 0.5);
+ var geometry = new THREE.CircleGeometry(radius, segments);
+ var ring = new THREE.Line(geometry, material);
+ this.scene.add(ring);
+ this.rings.push(ring);
+ }
+ }
+ }, {
+ key: 'onUpdate',
+ value: function onUpdate(data) {
+ for (var i = 0; i < RING_COUNT; i++) {
+ var ring = this.rings[i];
+ var timeDomain = data.timeDomainData[i];
+ var frequency = Math.abs(data.frequencyData[i]);
+ var scale = this.lerp(ring.scale.x, frequency * timeDomain, 0.01);
+ scale = this.constrain(2, 0.5, scale);
+ ring.scale.set(scale, scale, scale);
+ ring.rotation.z += 0.002 * i;
+ }
+ data.renderer.render(this.scene, this.camera);
+ }
+ }, {
+ key: 'onResize',
+ value: function onResize(data) {
+ this.camera.aspect = data.width / data.height;
+ this.camera.updateProjectionMatrix();
+ }
+ }, {
+ key: 'onDestroy',
+ value: function onDestroy() {
+ delete this.scene;
+ delete this.camera;
+ }
+ }]);
+
+ return RingVisualiser;
+}(Visualiser);
+
+module.exports = RingVisualiser;
+
+/***/ }),
+/* 17 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+/**
+ * @author Timur Kuzhagaliyev
+ * @copyright 2017
+ * @license GPL-3.0
+ */
+
+// eslint-disable-next-line
+var _require = __webpack_require__(4),
+ render = _require.render,
+ h = _require.h;
+// eslint-disable-next-line
+
+
+var UIComponent = __webpack_require__(18);
+
+var UI = function () {
+
+ /**
+ * @param {object} data
+ * @param {Element} data.container
+ * @param {MusicPlayer} data.musicPlayer
+ * @param {VisualisationCore} data.visCore
+ */
+ function UI(data) {
+ _classCallCheck(this, UI);
+
+ this.container = data.container;
+ this.musicPlayer = data.musicPlayer;
+ this.visCore = data.visCore;
+ }
+
+ _createClass(UI, [{
+ key: 'start',
+ value: function start() {
+ render(h(UIComponent, { musicPlayer: this.musicPlayer, visCore: this.visCore }), this.container);
+ }
+ }]);
+
+ return UI;
+}();
+
+module.exports = UI;
+
+/***/ }),
+/* 18 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * @author Timur Kuzhagaliyev
+ * @copyright 2017
+ * @license GPL-3.0
+ */
+
+// eslint-disable-next-line
+var _require = __webpack_require__(4),
+ Component = _require.Component,
+ h = _require.h;
+
+var PlayerStates = __webpack_require__(2).States;
+
+var UIComponent = function (_Component) {
+ _inherits(UIComponent, _Component);
+
+ function UIComponent(props) {
+ _classCallCheck(this, UIComponent);
+
+ var _this = _possibleConstructorReturn(this, (UIComponent.__proto__ || Object.getPrototypeOf(UIComponent)).call(this, props));
+
+ _this.state = {
+ playerState: null,
+ trackList: [],
+ currentTrackIndex: null,
+ visualisers: [],
+ currentVisualiserIndex: null
+ };
+ props.musicPlayer.addListener(_this.playbackListener.bind(_this));
+ props.visCore.addListener(_this.visualiserListener.bind(_this));
+ return _this;
+ }
+
+ _createClass(UIComponent, [{
+ key: 'playbackListener',
+ value: function playbackListener(playerState, trackList, currentTrackIndex) {
+ this.setState({
+ playerState: playerState,
+ trackList: trackList,
+ currentTrackIndex: currentTrackIndex
+ });
+ }
+ }, {
+ key: 'visualiserListener',
+ value: function visualiserListener(visualisers, currentVisualiserIndex) {
+ this.setState({
+ visualisers: visualisers,
+ currentVisualiserIndex: currentVisualiserIndex
+ });
+ }
+ }, {
+ key: 'playTrack',
+ value: function playTrack(index, event) {
+ event.preventDefault();
+ this.props.musicPlayer.playTrack(index);
+ }
+ }, {
+ key: 'togglePlayback',
+ value: function togglePlayback(event) {
+ event.preventDefault();
+ var state = this.state;
+ state.playing = this.props.musicPlayer.togglePlayback();
+ this.setState(state);
+ }
+ }, {
+ key: 'addTrackByUrl',
+ value: function addTrackByUrl(event) {
+ event.preventDefault();
+ var audioUrl = prompt('Enter the URL of an audio file');
+ if (audioUrl) {
+ this.props.musicPlayer.addTrack(audioUrl);
+ }
+ }
+ }, {
+ key: 'uploadAudioFile',
+ value: function uploadAudioFile(event) {
+ event.preventDefault();
+ if (!this.fileInput) return;
+ if (!this.fileInput.onchange) this.fileInput.onchange = this.addAudioFile.bind(this);
+ this.fileInput.click();
+ }
+ }, {
+ key: 'addAudioFile',
+ value: function addAudioFile() {
+ var files = this.fileInput.files;
+ for (var i = 0; i < files.length; i++) {
+ var file = files[i];
+ if (file.type.match(/audio.*/)) {
+ this.props.musicPlayer.addTrack(file);
+ }
+ }
+ }
+ }, {
+ key: 'getTrackList',
+ value: function getTrackList() {
+ var trackList = this.state.trackList;
+ if (trackList) {
+ var trackComponents = [];
+ for (var i = 0; i < trackList.length; i++) {
+ var track = trackList[i];
+ var isActive = this.state.currentTrackIndex === i;
+ var activeClass = isActive ? 'active' : '';
+ var symbol = isActive ? this.getPlaybackSymbol() : '#' + (i + 1);
+ trackComponents.push(h(
+ 'a',
+ { href: '#', alt: 'Play track #' + (i + 1), onClick: this.playTrack.bind(this, i),
+ className: 'akko-ui-container-list-item ' + activeClass },
+ h(
+ 'span',
+ null,
+ symbol
+ ),
+ ' ',
+ track.title
+ ));
+ }
+ return h(
+ 'div',
+ { className: 'akko-ui-container-list' },
+ trackComponents
+ );
+ } else {
+ return null;
+ }
+ }
+ }, {
+ key: 'getPlaybackSymbol',
+ value: function getPlaybackSymbol() {
+ return !this.isPlaying() ? '❚❚' : '►';
+ }
+ }, {
+ key: 'getPlaybackButtonSymbol',
+ value: function getPlaybackButtonSymbol() {
+ return this.isPlaying() ? '❚❚' : '►';
+ }
+ }, {
+ key: 'isPlaying',
+ value: function isPlaying() {
+ return this.state.playerState === PlayerStates.PLAYING;
+ }
+ }, {
+ key: 'useVisualiser',
+ value: function useVisualiser(index, event) {
+ event.preventDefault();
+ this.props.visCore.useVisualiser(index);
+ }
+ }, {
+ key: 'getVisualiserList',
+ value: function getVisualiserList() {
+ var visualisers = this.state.visualisers;
+ if (visualisers) {
+ var visualiserComponents = [];
+ for (var i = 0; i < visualisers.length; i++) {
+ var visualiser = visualisers[i];
+ var isActive = this.state.currentVisualiserIndex === i;
+ var activeClass = isActive ? 'active' : '';
+ var symbol = visualiser.code;
+ visualiserComponents.push(h(
+ 'a',
+ { href: '#', alt: 'Use visualiser #' + (i + 1),
+ onClick: this.useVisualiser.bind(this, i),
+ className: 'akko-ui-container-list-item ' + activeClass },
+ h(
+ 'span',
+ null,
+ symbol
+ ),
+ ' ',
+ visualiser.name
+ ));
+ }
+ return h(
+ 'div',
+ { className: 'akko-ui-container-list' },
+ visualiserComponents
+ );
+ } else {
+ return null;
+ }
+ }
+ }, {
+ key: 'render',
+ value: function render() {
+ var _this2 = this;
+
+ return h(
+ 'div',
+ { className: 'akko-ui' },
+ h(
+ 'div',
+ { className: 'akko-ui-container akko-ui-tracks' },
+ h(
+ 'div',
+ { className: 'akko-ui-container-title' },
+ 'Player: ',
+ this.state.playerState
+ ),
+ this.getTrackList(),
+ h(
+ 'div',
+ { className: 'akko-ui-add-tracks' },
+ h('input', { ref: function ref(input) {
+ return _this2.fileInput = input;
+ }, type: 'file', style: 'display: none;' }),
+ h(
+ 'a',
+ { href: '#', alt: 'Add a track by URL', onClick: this.addTrackByUrl.bind(this) },
+ 'Add track by URL'
+ ),
+ ' or ',
+ h(
+ 'a',
+ { href: '#', alt: 'Upload an audio file', onClick: this.uploadAudioFile.bind(this) },
+ 'upload audio file'
+ ),
+ h('br', null),
+ 'or drag & drop a file into the visualiser.'
+ )
+ ),
+ h(
+ 'div',
+ { className: 'akko-ui-container akko-ui-visualisers' },
+ h(
+ 'div',
+ { className: 'akko-ui-container-title' },
+ 'Visualisers'
+ ),
+ this.getVisualiserList()
+ ),
+ h(
+ 'div',
+ { className: 'akko-ui-controls' },
+ h(
+ 'a',
+ { href: '#', alt: 'Toggle playback', onClick: this.togglePlayback.bind(this),
+ className: 'akko-ui-controls-play ' + (this.isPlaying() ? 'active' : '') },
+ this.getPlaybackButtonSymbol()
+ ),
+ h(
+ 'div',
+ { className: 'akko-ui-controls-progress' },
+ h('div', { className: 'akko-ui-controls-progress-indicator' })
+ ),
+ h('div', { className: 'akko-ui-controls-volume' })
+ )
+ );
+ }
+ }]);
+
+ return UIComponent;
+}(Component);
+
+module.exports = UIComponent;
+
+/***/ })
+/******/ ]);
\ No newline at end of file
diff --git a/examples/akko-custom-es12.html b/examples/akko-custom-es12.html
new file mode 100644
index 0000000..6430db6
--- /dev/null
+++ b/examples/akko-custom-es12.html
@@ -0,0 +1,572 @@
+
+
+
+
+
+ ES12+ - Next-Gen Audio Visualizer
+
+
+
+
+
+
+
+
+
+
+ ES12+ NEXT-GEN
+ ⏰ Back in Time
+
+
+
+
+
Optional Chaining
+
Nullish Coalescing
+
Top-Level Await
+
Private Fields
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/es12-mixer/README.md b/examples/es12-mixer/README.md
new file mode 100644
index 0000000..e5db7fc
--- /dev/null
+++ b/examples/es12-mixer/README.md
@@ -0,0 +1,121 @@
+# ES12+ Mixer Example
+
+This example showcases the ES12+ Particle Swarm Visualiser integrated with the Akko framework, demonstrating cutting-edge JavaScript features in action.
+
+## Features
+
+### 🌟 Modern JavaScript (ES12+)
+- **Private Fields**: `#privateField` syntax for true encapsulation
+- **Optional Chaining**: `obj?.prop?.method?.()` for safe property access
+- **Nullish Coalescing**: `value ?? default` for robust default values
+- **Top-level Await**: Direct await in module scope
+- **Logical Assignment**: `x ||= y`, `x &&= y`, `x ??= y`
+
+### 🎨 Visual Effects
+- **3 Particle Styles**: Points, Cubes, Spheres
+- **5 Color Schemes**: Rainbow, Fire, Ocean, Neon, Cyber
+- **Audio Reactivity**: Real-time response to music
+- **Explosion Effects**: Bass/treble spike detection
+- **Swarm Intelligence**: Force-based particle movement
+
+### 🎛️ Interactive Controls
+- **Style Selector**: Switch between particle types
+- **Color Schemes**: Choose from 5 futuristic palettes
+- **Particle Count**: Adjust from 100-2000 particles
+- **Real-time Updates**: Changes apply instantly
+
+## Usage
+
+### 🚨 **Server Required**
+This example uses ES modules and requires an HTTP server:
+
+```bash
+# From Akko root directory
+npm run examples
+# Then visit: http://localhost:8080/examples/es12-mixer/
+```
+
+**Cannot run directly via `file://` protocol** due to:
+- ES6 modules (`
+
+
+
+
+
+
+
+
diff --git a/index.html b/index.html
index 678afbd..418f729 100644
--- a/index.html
+++ b/index.html
@@ -21,6 +21,7 @@ Akko Music Visualising Framework
Akko as an inline element on a page
Akko with a custom visualiser (ES5 version)
Akko with a custom visualiser (ES6 version)
+ 🚀 ES12+ Mixer - Next-Gen Audio Visualizer (Modern JavaScript features)